1use cmake_parser_derive::CMake;
2
3use crate::{
4 doc::command_scope::{CommandScope, ToCommandScope},
5 Token,
6};
7
8#[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}