cmake_parser/doc/command/scripting/
cmake_parse_arguments.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Parse function or macro arguments.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/cmake_parse_arguments.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate", untagged)]
13pub enum CMakeParseArguments<'t> {
14    #[cmake(rename = "PARSE_ARGV", transparent)]
15    Function(CMakeParseArgumentsFunction<'t>),
16    Regular(CMakeParseArgumentsRegular<'t>),
17}
18
19impl<'t> ToCommandScope for CMakeParseArguments<'t> {
20    fn to_command_scope(&self) -> CommandScope {
21        CommandScope::Scripting
22    }
23}
24
25#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
26#[cmake(pkg = "crate", positional)]
27pub struct CMakeParseArgumentsRegular<'t> {
28    pub prefix: Token<'t>,
29    pub options: Token<'t>,
30    pub one_value_keywords: Token<'t>,
31    pub multi_value_keywords: Token<'t>,
32    pub args: Option<Vec<Token<'t>>>,
33}
34
35#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
36#[cmake(pkg = "crate", positional)]
37pub struct CMakeParseArgumentsFunction<'t> {
38    pub n: Token<'t>,
39    pub prefix: Token<'t>,
40    pub options: Token<'t>,
41    pub one_value_keywords: Token<'t>,
42    pub multi_value_keywords: Token<'t>,
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    use crate::doc::cmake_parse::tests::{token, tokens_vec};
49    use crate::*;
50    use pretty_assertions::assert_eq;
51
52    #[test]
53    fn cmake_parse_arguments() {
54        let src = include_bytes!("../../../../../fixture/commands/scripting/cmake_parse_arguments");
55        let cmakelists = parse_cmakelists(src).unwrap();
56        let doc = Doc::from(cmakelists);
57        assert_eq!(
58            doc.commands(),
59            Ok(vec![
60                Command::CMakeParseArguments(Box::new(CMakeParseArguments::Regular(
61                    CMakeParseArgumentsRegular {
62                        prefix: token(b"prefix1"),
63                        options: token(b"options1"),
64                        one_value_keywords: token(b"one_value_keywords1"),
65                        multi_value_keywords: token(b"multi_value_keywords1"),
66                        args: Some(tokens_vec([b"arg1", b"arg2"])),
67                    }
68                ))),
69                Command::CMakeParseArguments(Box::new(CMakeParseArguments::Function(
70                    CMakeParseArgumentsFunction {
71                        n: token(b"5"),
72                        prefix: token(b"prefix1"),
73                        options: token(b"options1"),
74                        one_value_keywords: token(b"one_value_keywords1"),
75                        multi_value_keywords: token(b"multi_value_keywords1"),
76                    }
77                ))),
78            ])
79        )
80    }
81}