1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, ValueRef},
8 Result as RusqliteResult,
11 use crate::rs::SuggestRecordType;
13 /// A provider is a source of search suggestions.
14 #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
16 pub enum SuggestionProvider {
28 impl FromSql for SuggestionProvider {
29 fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
30 let v = value.as_i64()?;
33 .and_then(SuggestionProvider::from_u8)
34 .ok_or_else(|| FromSqlError::OutOfRange(v))
38 impl SuggestionProvider {
39 pub fn all() -> [Self; 9] {
54 pub(crate) fn from_u8(v: u8) -> Option<Self> {
56 1 => Some(SuggestionProvider::Amp),
57 2 => Some(SuggestionProvider::Wikipedia),
58 3 => Some(SuggestionProvider::Amo),
59 4 => Some(SuggestionProvider::Pocket),
60 5 => Some(SuggestionProvider::Yelp),
61 6 => Some(SuggestionProvider::Mdn),
62 7 => Some(SuggestionProvider::Weather),
63 8 => Some(SuggestionProvider::AmpMobile),
64 9 => Some(SuggestionProvider::Fakespot),
69 pub(crate) fn records_for_provider(&self) -> Vec<SuggestRecordType> {
71 SuggestionProvider::Amp => {
73 SuggestRecordType::AmpWikipedia,
74 SuggestRecordType::Icon,
75 SuggestRecordType::GlobalConfig,
78 SuggestionProvider::Wikipedia => {
80 SuggestRecordType::AmpWikipedia,
81 SuggestRecordType::Icon,
82 SuggestRecordType::GlobalConfig,
85 SuggestionProvider::Amo => {
86 vec![SuggestRecordType::Amo, SuggestRecordType::GlobalConfig]
88 SuggestionProvider::Pocket => {
89 vec![SuggestRecordType::Pocket, SuggestRecordType::GlobalConfig]
91 SuggestionProvider::Yelp => {
93 SuggestRecordType::Yelp,
94 SuggestRecordType::Icon,
95 SuggestRecordType::GlobalConfig,
98 SuggestionProvider::Mdn => {
99 vec![SuggestRecordType::Mdn, SuggestRecordType::GlobalConfig]
101 SuggestionProvider::Weather => {
102 vec![SuggestRecordType::Weather, SuggestRecordType::GlobalConfig]
104 SuggestionProvider::AmpMobile => {
106 SuggestRecordType::AmpMobile,
107 SuggestRecordType::AmpWikipedia,
108 SuggestRecordType::Icon,
109 SuggestRecordType::GlobalConfig,
112 SuggestionProvider::Fakespot => {
113 vec![SuggestRecordType::Fakespot]
119 impl ToSql for SuggestionProvider {
120 fn to_sql(&self) -> RusqliteResult<ToSqlOutput<'_>> {
121 Ok(ToSqlOutput::from(*self as u8))