cmake_parser/doc/command/project/
define_property.rs

1use ::cmake_parser_derive::CMake;
2
3use crate::{CommandScope, ToCommandScope, Token};
4
5/// Define and document custom properties.
6///
7/// Reference: <https://cmake.org/cmake/help/v3.26/command/define_property.html>
8#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[cmake(pkg = "crate")]
10pub struct DefineProperty<'t> {
11    #[cmake(positional)]
12    pub property_scope: PropertyScope,
13    #[cmake(rename = "PROPERTY", positional, transparent)]
14    pub property_name: Token<'t>,
15    pub inherited: bool,
16    pub brief_docs: Option<Vec<Token<'t>>>,
17    pub full_docs: Option<Vec<Token<'t>>>,
18    pub initialize_from_variable: Option<Token<'t>>,
19}
20
21impl<'t> ToCommandScope for DefineProperty<'t> {
22    fn to_command_scope(&self) -> CommandScope {
23        CommandScope::Project
24    }
25}
26
27#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cmake(pkg = "crate")]
29pub enum PropertyScope {
30    Global,
31    Directory,
32    Target,
33    Source,
34    Test,
35    Variable,
36    CachedVariable,
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use crate::doc::cmake_parse::tests::quoted_tokens;
43    use crate::*;
44
45    #[test]
46    fn define_property() {
47        let src = include_bytes!("../../../../../fixture/commands/project/define_property");
48        let cmakelists = parse_cmakelists(src).unwrap();
49        let doc = Doc::from(cmakelists);
50
51        assert_eq!(
52            doc.commands(),
53            Ok(vec![
54                Command::DefineProperty(Box::new(DefineProperty {
55                    property_scope: PropertyScope::Target,
56                    property_name: b"EXAMPLE_TYPE".into(),
57                    inherited: false,
58                    brief_docs: Some(
59                        quoted_tokens([b"Whether given target describes example."]).to_vec()
60                    ),
61                    full_docs: Some(
62                        quoted_tokens([b"Whether given target describes example."]).to_vec()
63                    ),
64                    initialize_from_variable: None,
65                })),
66                Command::DefineProperty(Box::new(DefineProperty {
67                    property_scope: PropertyScope::CachedVariable,
68                    property_name: b"A_PROPERTY".into(),
69                    inherited: false,
70                    brief_docs: Some(quoted_tokens([b"brief"]).to_vec()),
71                    full_docs: Some(quoted_tokens([b"full"]).to_vec()),
72                    initialize_from_variable: None,
73                })),
74            ])
75        )
76    }
77}