1use glib::GString;
4use ostree::glib;
5
6pub trait KeyFileExt {
8 fn optional_string(&self, group: &str, key: &str) -> Result<Option<GString>, glib::Error>;
10 fn optional_bool(&self, group: &str, key: &str) -> Result<Option<bool>, glib::Error>;
12}
13
14pub fn map_keyfile_optional<T>(res: Result<T, glib::Error>) -> Result<Option<T>, glib::Error> {
16 match res {
17 Ok(v) => Ok(Some(v)),
18 Err(e) => {
19 if let Some(t) = e.kind::<glib::KeyFileError>() {
20 match t {
21 glib::KeyFileError::GroupNotFound | glib::KeyFileError::KeyNotFound => Ok(None),
22 _ => Err(e),
23 }
24 } else {
25 Err(e)
26 }
27 }
28 }
29}
30
31impl KeyFileExt for glib::KeyFile {
32 fn optional_string(&self, group: &str, key: &str) -> Result<Option<GString>, glib::Error> {
33 map_keyfile_optional(self.string(group, key))
34 }
35
36 fn optional_bool(&self, group: &str, key: &str) -> Result<Option<bool>, glib::Error> {
37 map_keyfile_optional(self.boolean(group, key))
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn test_optional() {
47 let kf = glib::KeyFile::new();
48 assert_eq!(kf.optional_string("foo", "bar").unwrap(), None);
49 kf.set_string("foo", "baz", "someval");
50 assert_eq!(kf.optional_string("foo", "bar").unwrap(), None);
51 assert_eq!(
52 kf.optional_string("foo", "baz").unwrap().unwrap(),
53 "someval"
54 );
55
56 assert!(kf.optional_bool("foo", "baz").is_err());
57 assert_eq!(kf.optional_bool("foo", "bar").unwrap(), None);
58 kf.set_boolean("foo", "somebool", false);
59 assert_eq!(kf.optional_bool("foo", "somebool").unwrap(), Some(false));
60 }
61}