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}