libgir/config/
property_generate_flags.rs

1use std::str::FromStr;
2
3use bitflags::bitflags;
4
5use super::error::TomlHelper;
6
7bitflags! {
8    #[derive(Clone, Copy, Debug, PartialEq, Eq)]
9    pub struct PropertyGenerateFlags: u32 {
10        const GET = 1;
11        const SET = 2;
12        const NOTIFY = 4;
13    }
14}
15
16impl FromStr for PropertyGenerateFlags {
17    type Err = String;
18    fn from_str(s: &str) -> Result<Self, Self::Err> {
19        match s {
20            "get" => Ok(Self::GET),
21            "set" => Ok(Self::SET),
22            "notify" => Ok(Self::NOTIFY),
23            _ => Err(format!("Wrong property generate flag \"{s}\"")),
24        }
25    }
26}
27
28impl PropertyGenerateFlags {
29    pub fn parse_flags(toml: &toml::Value, option: &str) -> Result<Self, String> {
30        let array = toml.as_result_vec(option)?;
31        let mut val = Self::empty();
32        for v in array {
33            let s = v.as_str().ok_or(format!(
34                "Invalid `{}` value element, expected a string, found {}",
35                option,
36                v.type_str()
37            ))?;
38            match Self::from_str(s) {
39                Ok(v) => val |= v,
40                e @ Err(_) => return e,
41            }
42        }
43        Ok(val)
44    }
45}
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    fn parse(val: &str) -> Result<PropertyGenerateFlags, String> {
51        let input = format!("generate={val}");
52        let table: toml::Value = toml::from_str(&input).unwrap();
53        let value = table.lookup("generate").unwrap();
54        PropertyGenerateFlags::parse_flags(value, "generate")
55    }
56
57    #[test]
58    fn parse_flags() {
59        assert_eq!(parse(r#"["get"]"#).unwrap(), PropertyGenerateFlags::GET);
60        assert_eq!(parse(r#"["set"]"#).unwrap(), PropertyGenerateFlags::SET);
61        assert_eq!(
62            parse(r#"["notify"]"#).unwrap(),
63            PropertyGenerateFlags::NOTIFY
64        );
65        assert_eq!(
66            parse(r#"["set","get"]"#).unwrap(),
67            PropertyGenerateFlags::GET | PropertyGenerateFlags::SET
68        );
69        assert_eq!(
70            parse(r#""get""#),
71            Err("Invalid `generate` value, expected a array, found string".into())
72        );
73        assert_eq!(
74            parse(r#"[true]"#),
75            Err("Invalid `generate` value element, expected a string, found boolean".into())
76        );
77        assert_eq!(
78            parse(r#"["bad"]"#),
79            Err("Wrong property generate flag \"bad\"".into())
80        );
81        assert_eq!(
82            parse(r#"["get", "bad"]"#),
83            Err("Wrong property generate flag \"bad\"".into())
84        );
85    }
86}