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 let r = toml(
154 r#"
155name = "name1"
156"#,
157 );
158 let f = Member::parse(&r, "a").unwrap();
159 assert!(f.generate_doc);
160 }
161}