use std::ffi::{CString, NulError};
use crate::error::Result;
use crate::key::{self, Key};
use crate::value::PreferenceValue;
pub struct Preferences {
domain: CString,
}
impl Preferences {
pub fn new(domain: &str) -> std::result::Result<Self, NulError> {
Ok(Self {
domain: CString::new(domain)?,
})
}
pub fn get<T: PreferenceValue>(&self, key: Key<T>) -> Result<Option<T>> {
let key = key::key_cstring(key.name());
T::get(&self.domain, &key)
}
pub fn get_or<T: PreferenceValue>(&self, key: Key<T>, default: T) -> Result<T> {
Ok(self.get(key)?.unwrap_or(default))
}
#[allow(clippy::needless_pass_by_value)]
pub fn set<T: PreferenceValue>(&self, key: Key<T>, value: &T) -> Result<()> {
let key = key::key_cstring(key.name());
T::set(&self.domain, &key, value)
}
pub fn remove<T: PreferenceValue>(&self, key: Key<T>) -> Result<()> {
let key = key::key_cstring(key.name());
T::remove(&self.domain, &key)
}
pub fn contains<T: PreferenceValue>(&self, key: Key<T>) -> Result<bool> {
let key = key::key_cstring(key.name());
T::contains(&self.domain, &key)
}
}
impl Clone for Preferences {
fn clone(&self) -> Self {
Self {
domain: self.domain.clone(),
}
}
}
impl std::fmt::Debug for Preferences {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Preferences")
.field("domain", &self.domain.to_string_lossy())
.finish()
}
}