diff options
Diffstat (limited to 'third_party/rust/suggest/src/provider.rs')
-rw-r--r-- | third_party/rust/suggest/src/provider.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/third_party/rust/suggest/src/provider.rs b/third_party/rust/suggest/src/provider.rs new file mode 100644 index 0000000000..1449c35c8a --- /dev/null +++ b/third_party/rust/suggest/src/provider.rs @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use rusqlite::{ + types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, ValueRef}, + Result as RusqliteResult, +}; + +/// A provider is a source of search suggestions. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] +#[repr(u8)] +pub enum SuggestionProvider { + Amp = 1, + Wikipedia = 2, + Amo = 3, + Pocket = 4, + Yelp = 5, + Mdn = 6, + Weather = 7, + AmpMobile = 8, +} + +impl FromSql for SuggestionProvider { + fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> { + let v = value.as_i64()?; + u8::try_from(v) + .ok() + .and_then(SuggestionProvider::from_u8) + .ok_or_else(|| FromSqlError::OutOfRange(v)) + } +} + +impl SuggestionProvider { + #[inline] + pub(crate) fn from_u8(v: u8) -> Option<Self> { + match v { + 1 => Some(SuggestionProvider::Amp), + 2 => Some(SuggestionProvider::Wikipedia), + 3 => Some(SuggestionProvider::Amo), + 4 => Some(SuggestionProvider::Pocket), + 5 => Some(SuggestionProvider::Yelp), + 6 => Some(SuggestionProvider::Mdn), + 7 => Some(SuggestionProvider::Weather), + _ => None, + } + } +} + +impl ToSql for SuggestionProvider { + fn to_sql(&self) -> RusqliteResult<ToSqlOutput<'_>> { + Ok(ToSqlOutput::from(*self as u8)) + } +} |