libgir/config/
members.rs

1use log::error;
2use toml::Value;
3
4use super::{error::TomlHelper, gobjects::GStatus, ident::Ident, parsable::Parse};
5use crate::version::Version;
6
7#[derive(Clone, Debug)]
8pub struct Member {
9    pub ident: Ident,
10    pub version: Option<Version>,
11    pub deprecated_version: Option<Version>,
12    pub status: GStatus,
13    pub cfg_condition: Option<String>,
14    pub generate_doc: bool,
15}
16
17impl Parse for Member {
18    fn parse(toml: &Value, object_name: &str) -> Option<Self> {
19        let Some(ident) = Ident::parse(toml, object_name, "member") else {
20            error!(
21                "No 'name' or 'pattern' given for member for object {}",
22                object_name
23            );
24            return None;
25        };
26
27        toml.check_unwanted(
28            &[
29                "version",
30                "name",
31                "pattern",
32                "ignore",
33                "manual",
34                "cfg_condition",
35                "generate_doc",
36            ],
37            &format!("member {object_name}"),
38        );
39        let version = toml
40            .lookup("version")
41            .and_then(Value::as_str)
42            .and_then(|s| s.parse().ok());
43        let deprecated_version = toml
44            .lookup("deprecated_version")
45            .and_then(Value::as_str)
46            .and_then(|s| s.parse().ok());
47        let cfg_condition = toml
48            .lookup("cfg_condition")
49            .and_then(Value::as_str)
50            .map(ToOwned::to_owned);
51
52        let status = {
53            if toml
54                .lookup("ignore")
55                .and_then(Value::as_bool)
56                .unwrap_or(false)
57            {
58                GStatus::Ignore
59            } else if toml
60                .lookup("manual")
61                .and_then(Value::as_bool)
62                .unwrap_or(false)
63            {
64                GStatus::Manual
65            } else {
66                GStatus::Generate
67            }
68        };
69        let generate_doc = toml
70            .lookup("generate_doc")
71            .and_then(Value::as_bool)
72            .unwrap_or(true);
73
74        Some(Self {
75            ident,
76            version,
77            deprecated_version,
78            status,
79            cfg_condition,
80            generate_doc,
81        })
82    }
83}
84
85impl AsRef<Ident> for Member {
86    fn as_ref(&self) -> &Ident {
87        &self.ident
88    }
89}
90
91pub type Members = Vec<Member>;
92
93#[cfg(test)]
94mod tests {
95    use super::{
96        super::{ident::Ident, parsable::Parse},
97        *,
98    };
99    use crate::version::Version;
100
101    fn toml(input: &str) -> ::toml::Value {
102        let value = ::toml::from_str(input);
103        assert!(value.is_ok());
104        value.unwrap()
105    }
106
107    #[test]
108    fn member_parse_alias() {
109        let toml = toml(
110            r#"
111name = "name1"
112"#,
113        );
114        let f = Member::parse(&toml, "a").unwrap();
115        assert_eq!(f.ident, Ident::Name("name1".into()));
116    }
117
118    #[test]
119    fn member_parse_version_default() {
120        let toml = toml(
121            r#"
122name = "name1"
123"#,
124        );
125        let f = Member::parse(&toml, "a").unwrap();
126        assert_eq!(f.version, None);
127    }
128
129    #[test]
130    fn member_parse_version() {
131        let toml = toml(
132            r#"
133name = "name1"
134version = "3.20"
135"#,
136        );
137        let f = Member::parse(&toml, "a").unwrap();
138        assert_eq!(f.version, Some(Version::new(3, 20, 0)));
139    }
140
141    #[test]
142    fn member_parse_generate_doc() {
143        let r = toml(
144            r#"
145name = "name1"
146generate_doc = false
147"#,
148        );
149        let f = Member::parse(&r, "a").unwrap();
150        assert!(!f.generate_doc);
151
152        // We now ensure that the default value is true.
153        let r = toml(
154            r#"
155name = "name1"
156"#,
157        );
158        let f = Member::parse(&r, "a").unwrap();
159        assert!(f.generate_doc);
160    }
161}