cmake_parser/doc/command/scripting/
cmake_parse_arguments.rs1use 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", 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}