summaryrefslogtreecommitdiffstats
path: root/testing/mozbase/rust/mozprofile/src/preferences.rs
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozbase/rust/mozprofile/src/preferences.rs')
-rw-r--r--testing/mozbase/rust/mozprofile/src/preferences.rs138
1 files changed, 138 insertions, 0 deletions
diff --git a/testing/mozbase/rust/mozprofile/src/preferences.rs b/testing/mozbase/rust/mozprofile/src/preferences.rs
new file mode 100644
index 0000000000..2489352384
--- /dev/null
+++ b/testing/mozbase/rust/mozprofile/src/preferences.rs
@@ -0,0 +1,138 @@
+/* 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 std::collections::BTreeMap;
+
+pub type Preferences = BTreeMap<String, Pref>;
+
+#[derive(Debug, PartialEq, Clone)]
+pub enum PrefValue {
+ Bool(bool),
+ String(String),
+ Int(i64),
+}
+
+impl From<bool> for PrefValue {
+ fn from(value: bool) -> Self {
+ PrefValue::Bool(value)
+ }
+}
+
+impl From<String> for PrefValue {
+ fn from(value: String) -> Self {
+ PrefValue::String(value)
+ }
+}
+
+impl From<&'static str> for PrefValue {
+ fn from(value: &'static str) -> Self {
+ PrefValue::String(value.into())
+ }
+}
+
+impl From<i8> for PrefValue {
+ fn from(value: i8) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<u8> for PrefValue {
+ fn from(value: u8) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<i16> for PrefValue {
+ fn from(value: i16) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<u16> for PrefValue {
+ fn from(value: u16) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<i32> for PrefValue {
+ fn from(value: i32) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<u32> for PrefValue {
+ fn from(value: u32) -> Self {
+ PrefValue::Int(value.into())
+ }
+}
+
+impl From<i64> for PrefValue {
+ fn from(value: i64) -> Self {
+ PrefValue::Int(value)
+ }
+}
+
+// Implementing From<u64> for PrefValue wouldn't be safe
+// because it might overflow.
+
+#[derive(Debug, PartialEq, Clone)]
+pub struct Pref {
+ pub value: PrefValue,
+ pub sticky: bool,
+}
+
+impl Pref {
+ /// Create a new preference with `value`.
+ pub fn new<T>(value: T) -> Pref
+ where
+ T: Into<PrefValue>,
+ {
+ Pref {
+ value: value.into(),
+ sticky: false,
+ }
+ }
+
+ /// Create a new sticky, or locked, preference with `value`.
+ /// These cannot be changed by the user in `about:config`.
+ pub fn new_sticky<T>(value: T) -> Pref
+ where
+ T: Into<PrefValue>,
+ {
+ Pref {
+ value: value.into(),
+ sticky: true,
+ }
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::PrefValue;
+
+ #[test]
+ fn test_bool() {
+ assert_eq!(PrefValue::from(true), PrefValue::Bool(true));
+ }
+
+ #[test]
+ fn test_string() {
+ assert_eq!(PrefValue::from("foo"), PrefValue::String("foo".to_string()));
+ assert_eq!(
+ PrefValue::from("foo".to_string()),
+ PrefValue::String("foo".to_string())
+ );
+ }
+
+ #[test]
+ fn test_int() {
+ assert_eq!(PrefValue::from(42i8), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42u8), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42i16), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42u16), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42i32), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42u32), PrefValue::Int(42i64));
+ assert_eq!(PrefValue::from(42i64), PrefValue::Int(42i64));
+ }
+}