ostree_ext/
keyfileext.rs

1//! Helper methods for [`glib::KeyFile`].
2
3use glib::GString;
4use ostree::glib;
5
6/// Helper methods for [`glib::KeyFile`].
7pub trait KeyFileExt {
8    /// Get a string value, but return `None` if the key does not exist.
9    fn optional_string(&self, group: &str, key: &str) -> Result<Option<GString>, glib::Error>;
10    /// Get a boolean value, but return `None` if the key does not exist.
11    fn optional_bool(&self, group: &str, key: &str) -> Result<Option<bool>, glib::Error>;
12}
13
14/// Consume a keyfile error, mapping the case where group or key is not found to `Ok(None)`.
15pub 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}