cmake_parser/doc/command/scripting/
set_property.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Set a named property in a given scope.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/set_property.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate", default = "values")]
13pub struct SetProperty<'t> {
14    pub scope: Scope<'t>,
15    pub append: bool,
16    pub append_string: bool,
17    pub property: Token<'t>,
18    #[cmake(rename = "")]
19    pub values: Option<Vec<Token<'t>>>,
20}
21
22impl<'t> ToCommandScope for SetProperty<'t> {
23    fn to_command_scope(&self) -> CommandScope {
24        CommandScope::Scripting
25    }
26}
27
28#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
29#[cmake(pkg = "crate", transparent, complete)]
30pub enum Scope<'t> {
31    Global,
32    #[cmake(positional)]
33    Directory(Option<Token<'t>>),
34    #[cmake(positional)]
35    Target(Option<Vec<Token<'t>>>),
36    Source(Source<'t>),
37    #[cmake(positional)]
38    Install(Option<Vec<Token<'t>>>),
39    #[cmake(positional)]
40    Test(Option<Vec<Token<'t>>>),
41    #[cmake(positional)]
42    Cache(Option<Vec<Token<'t>>>),
43}
44
45#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
46#[cmake(pkg = "crate", default = "source", allow_empty)]
47pub struct Source<'t> {
48    #[cmake(rename = "")]
49    pub source: Option<Vec<Token<'t>>>,
50    pub directory: Option<Vec<Token<'t>>>,
51    pub target_directory: Option<Vec<Token<'t>>>,
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57    use crate::doc::cmake_parse::tests::{token, tokens_vec};
58    use crate::*;
59    use pretty_assertions::assert_eq;
60
61    #[test]
62    fn set_property() {
63        let src = include_bytes!("../../../../../fixture/commands/scripting/set_property");
64        let cmakelists = parse_cmakelists(src).unwrap();
65        let doc = Doc::from(cmakelists);
66        assert_eq!(
67            doc.to_commands_iter().collect::<Vec<_>>(),
68            vec![
69                Ok(Command::SetProperty(Box::new(SetProperty {
70                    scope: Scope::Global,
71                    append: false,
72                    append_string: false,
73                    property: token(b"property1"),
74                    values: None,
75                }))),
76                Ok(Command::SetProperty(Box::new(SetProperty {
77                    scope: Scope::Global,
78                    append: true,
79                    append_string: true,
80                    property: token(b"property1"),
81                    values: Some(tokens_vec([b"value1", b"value2"])),
82                }))),
83                Ok(Command::SetProperty(Box::new(SetProperty {
84                    scope: Scope::Directory(None),
85                    append: false,
86                    append_string: false,
87                    property: token(b"property1"),
88                    values: None,
89                }))),
90                Ok(Command::SetProperty(Box::new(SetProperty {
91                    scope: Scope::Directory(Some(token(b"dir1"))),
92                    append: true,
93                    append_string: true,
94                    property: token(b"property1"),
95                    values: Some(tokens_vec([b"value1", b"value2"])),
96                }))),
97                Ok(Command::SetProperty(Box::new(SetProperty {
98                    scope: Scope::Target(None),
99                    append: false,
100                    append_string: false,
101                    property: token(b"property1"),
102                    values: None,
103                }))),
104                Ok(Command::SetProperty(Box::new(SetProperty {
105                    scope: Scope::Target(Some(tokens_vec([b"target1", b"target2"]))),
106                    append: false,
107                    append_string: false,
108                    property: token(b"property1"),
109                    values: None,
110                }))),
111                Ok(Command::SetProperty(Box::new(SetProperty {
112                    scope: Scope::Source(Source {
113                        source: None,
114                        directory: None,
115                        target_directory: None,
116                    }),
117                    append: false,
118                    append_string: false,
119                    property: token(b"property1"),
120                    values: None,
121                }))),
122                Ok(Command::SetProperty(Box::new(SetProperty {
123                    scope: Scope::Source(Source {
124                        source: Some(tokens_vec([b"src1", b"src2"])),
125                        directory: None,
126                        target_directory: None,
127                    }),
128                    append: false,
129                    append_string: false,
130                    property: token(b"property1"),
131                    values: None,
132                }))),
133                Ok(Command::SetProperty(Box::new(SetProperty {
134                    scope: Scope::Source(Source {
135                        source: None,
136                        directory: Some(tokens_vec([b"dir1", b"dir2"])),
137                        target_directory: None,
138                    }),
139                    append: false,
140                    append_string: false,
141                    property: token(b"property1"),
142                    values: None,
143                }))),
144                Ok(Command::SetProperty(Box::new(SetProperty {
145                    scope: Scope::Source(Source {
146                        source: None,
147                        directory: None,
148                        target_directory: Some(tokens_vec([b"tdir1", b"tdir2"])),
149                    }),
150                    append: false,
151                    append_string: false,
152                    property: token(b"property1"),
153                    values: None,
154                }))),
155                Ok(Command::SetProperty(Box::new(SetProperty {
156                    scope: Scope::Source(Source {
157                        source: None,
158                        directory: Some(tokens_vec([b"dir1", b"dir2"])),
159                        target_directory: Some(tokens_vec([b"tdir1", b"tdir2"])),
160                    }),
161                    append: false,
162                    append_string: false,
163                    property: token(b"property1"),
164                    values: None,
165                }))),
166                Ok(Command::SetProperty(Box::new(SetProperty {
167                    scope: Scope::Source(Source {
168                        source: Some(tokens_vec([b"src1", b"src2"])),
169                        directory: Some(tokens_vec([b"dir1", b"dir2"])),
170                        target_directory: Some(tokens_vec([b"tdir1", b"tdir2"])),
171                    }),
172                    append: true,
173                    append_string: true,
174                    property: token(b"property1"),
175                    values: Some(tokens_vec([b"value1", b"value2"])),
176                }))),
177                Ok(Command::SetProperty(Box::new(SetProperty {
178                    scope: Scope::Install(None),
179                    append: false,
180                    append_string: false,
181                    property: token(b"property1"),
182                    values: None,
183                }))),
184                Ok(Command::SetProperty(Box::new(SetProperty {
185                    scope: Scope::Install(Some(tokens_vec([b"install1", b"install2"]))),
186                    append: false,
187                    append_string: false,
188                    property: token(b"property1"),
189                    values: None,
190                }))),
191                Ok(Command::SetProperty(Box::new(SetProperty {
192                    scope: Scope::Test(None),
193                    append: false,
194                    append_string: false,
195                    property: token(b"property1"),
196                    values: None,
197                }))),
198                Ok(Command::SetProperty(Box::new(SetProperty {
199                    scope: Scope::Test(Some(tokens_vec([b"test1", b"test2"]))),
200                    append: false,
201                    append_string: false,
202                    property: token(b"property1"),
203                    values: None,
204                }))),
205                Ok(Command::SetProperty(Box::new(SetProperty {
206                    scope: Scope::Cache(None),
207                    append: false,
208                    append_string: false,
209                    property: token(b"property1"),
210                    values: None,
211                }))),
212                Ok(Command::SetProperty(Box::new(SetProperty {
213                    scope: Scope::Cache(Some(tokens_vec([b"entry1", b"entry2"]))),
214                    append: false,
215                    append_string: false,
216                    property: token(b"property1"),
217                    values: None,
218                }))),
219            ]
220        )
221    }
222}