Bug 1853821 fixing behaviour for BACKGROUND_TASK_SHARING_VIOLATION errorcode r=bytesi...
[gecko.git] / third_party / rust / suggest / src / provider.rs
blobeb2a9fd892eda831e823db6d311ea195755a6de7
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/.
4  */
6 use rusqlite::{
7     types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, ValueRef},
8     Result as RusqliteResult,
9 };
11 use crate::rs::SuggestRecordType;
13 /// A provider is a source of search suggestions.
14 #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
15 #[repr(u8)]
16 pub enum SuggestionProvider {
17     Amp = 1,
18     Wikipedia = 2,
19     Amo = 3,
20     Pocket = 4,
21     Yelp = 5,
22     Mdn = 6,
23     Weather = 7,
24     AmpMobile = 8,
25     Fakespot = 9,
28 impl FromSql for SuggestionProvider {
29     fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
30         let v = value.as_i64()?;
31         u8::try_from(v)
32             .ok()
33             .and_then(SuggestionProvider::from_u8)
34             .ok_or_else(|| FromSqlError::OutOfRange(v))
35     }
38 impl SuggestionProvider {
39     pub fn all() -> [Self; 9] {
40         [
41             Self::Amp,
42             Self::Wikipedia,
43             Self::Amo,
44             Self::Pocket,
45             Self::Yelp,
46             Self::Mdn,
47             Self::Weather,
48             Self::AmpMobile,
49             Self::Fakespot,
50         ]
51     }
53     #[inline]
54     pub(crate) fn from_u8(v: u8) -> Option<Self> {
55         match v {
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),
65             _ => None,
66         }
67     }
69     pub(crate) fn records_for_provider(&self) -> Vec<SuggestRecordType> {
70         match self {
71             SuggestionProvider::Amp => {
72                 vec![
73                     SuggestRecordType::AmpWikipedia,
74                     SuggestRecordType::Icon,
75                     SuggestRecordType::GlobalConfig,
76                 ]
77             }
78             SuggestionProvider::Wikipedia => {
79                 vec![
80                     SuggestRecordType::AmpWikipedia,
81                     SuggestRecordType::Icon,
82                     SuggestRecordType::GlobalConfig,
83                 ]
84             }
85             SuggestionProvider::Amo => {
86                 vec![SuggestRecordType::Amo, SuggestRecordType::GlobalConfig]
87             }
88             SuggestionProvider::Pocket => {
89                 vec![SuggestRecordType::Pocket, SuggestRecordType::GlobalConfig]
90             }
91             SuggestionProvider::Yelp => {
92                 vec![
93                     SuggestRecordType::Yelp,
94                     SuggestRecordType::Icon,
95                     SuggestRecordType::GlobalConfig,
96                 ]
97             }
98             SuggestionProvider::Mdn => {
99                 vec![SuggestRecordType::Mdn, SuggestRecordType::GlobalConfig]
100             }
101             SuggestionProvider::Weather => {
102                 vec![SuggestRecordType::Weather, SuggestRecordType::GlobalConfig]
103             }
104             SuggestionProvider::AmpMobile => {
105                 vec![
106                     SuggestRecordType::AmpMobile,
107                     SuggestRecordType::AmpWikipedia,
108                     SuggestRecordType::Icon,
109                     SuggestRecordType::GlobalConfig,
110                 ]
111             }
112             SuggestionProvider::Fakespot => {
113                 vec![SuggestRecordType::Fakespot]
114             }
115         }
116     }
119 impl ToSql for SuggestionProvider {
120     fn to_sql(&self) -> RusqliteResult<ToSqlOutput<'_>> {
121         Ok(ToSqlOutput::from(*self as u8))
122     }