cmake_parser/doc/command/scripting/
cmake_policy.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Manage CMake Policy settings.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/cmake_policy.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate", transparent)]
13pub enum CMakePolicy<'t> {
14    Version(PolicyVersion<'t>),
15    Set(PolicySet<'t>),
16    Get(PolicyGet<'t>),
17    Push,
18    Pop,
19}
20
21impl<'t> ToCommandScope for CMakePolicy<'t> {
22    fn to_command_scope(&self) -> CommandScope {
23        CommandScope::Scripting
24    }
25}
26
27#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cmake(pkg = "crate", positional)]
29pub struct PolicyVersion<'t> {
30    pub min: Token<'t>,
31}
32
33#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
34#[cmake(pkg = "crate", positional)]
35pub struct PolicySet<'t> {
36    pub policy: Token<'t>,
37    pub behavior: Behavior,
38}
39
40#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
41#[cmake(pkg = "crate", list)]
42pub enum Behavior {
43    New,
44    Old,
45}
46
47#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
48#[cmake(pkg = "crate", positional)]
49pub struct PolicyGet<'t> {
50    pub policy: Token<'t>,
51    pub variable: Token<'t>,
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57    use crate::doc::cmake_parse::tests::token;
58    use crate::*;
59    use pretty_assertions::assert_eq;
60
61    #[test]
62    fn cmake_policy() {
63        let src = include_bytes!("../../../../../fixture/commands/scripting/cmake_policy");
64        let cmakelists = parse_cmakelists(src).unwrap();
65        let doc = Doc::from(cmakelists);
66        assert_eq!(
67            doc.commands(),
68            Ok(vec![
69                Command::CMakePolicy(Box::new(CMakePolicy::Version(PolicyVersion {
70                    min: token(b"min1"),
71                }))),
72                Command::CMakePolicy(Box::new(CMakePolicy::Set(PolicySet {
73                    policy: token(b"CMP0001"),
74                    behavior: Behavior::New,
75                }))),
76                Command::CMakePolicy(Box::new(CMakePolicy::Set(PolicySet {
77                    policy: token(b"CMP0001"),
78                    behavior: Behavior::Old,
79                }))),
80                Command::CMakePolicy(Box::new(CMakePolicy::Get(PolicyGet {
81                    policy: token(b"CMP0001"),
82                    variable: token(b"variable1"),
83                }))),
84                Command::CMakePolicy(Box::new(CMakePolicy::Push)),
85                Command::CMakePolicy(Box::new(CMakePolicy::Pop)),
86            ])
87        )
88    }
89}