cmake_parser/doc/command/scripting/
execute_process.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    command::common::CustomCommand,
5    doc::command_scope::{CommandScope, ToCommandScope},
6    Token,
7};
8
9/// Execute one or more child processes.
10///
11/// Reference: <https://cmake.org/cmake/help/v3.26/command/execute_process.html>
12#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
13#[cmake(pkg = "crate")]
14pub struct ExecuteProcess<'t> {
15    #[cmake(rename = "COMMAND")]
16    pub commands: Vec<CustomCommand<'t>>,
17    pub working_directory: Option<Token<'t>>,
18    pub timeout: Option<Token<'t>>,
19    pub result_variable: Option<Token<'t>>,
20    pub results_variable: Option<Token<'t>>,
21    pub output_variable: Option<Token<'t>>,
22    pub error_variable: Option<Token<'t>>,
23    pub input_file: Option<Token<'t>>,
24    pub output_file: Option<Token<'t>>,
25    pub error_file: Option<Token<'t>>,
26    pub output_quiet: bool,
27    pub error_quiet: bool,
28    pub command_echo: Option<Token<'t>>,
29    pub output_strip_trailing_whitespace: bool,
30    pub error_strip_trailing_whitespace: bool,
31    pub encoding: Option<WindowsEncoding>,
32    pub echo_output_variable: bool,
33    pub echo_error_variable: bool,
34    pub command_error_is_fatal: Option<ErrorFatal>,
35}
36
37impl<'t> ToCommandScope for ExecuteProcess<'t> {
38    fn to_command_scope(&self) -> CommandScope {
39        CommandScope::Scripting
40    }
41}
42
43#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
44#[cmake(pkg = "crate", list)]
45pub enum ErrorFatal {
46    Any,
47    Last,
48}
49
50#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
51#[cmake(pkg = "crate", list)]
52pub enum WindowsEncoding {
53    None,
54    Auto,
55    Ansi,
56    Oem,
57    #[cmake(rename = ["UTF8", "UTF-8"])]
58    Utf8,
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    use crate::doc::cmake_parse::tests::{token, tokens_vec};
65    use crate::*;
66    use pretty_assertions::assert_eq;
67
68    #[test]
69    fn execute_process() {
70        let src = include_bytes!("../../../../../fixture/commands/scripting/execute_process");
71        let cmakelists = parse_cmakelists(src).unwrap();
72        let doc = Doc::from(cmakelists);
73        assert_eq!(
74            doc.commands(),
75            Ok(vec![
76                Command::ExecuteProcess(Box::new(ExecuteProcess {
77                    commands: vec![CustomCommand {
78                        name: token(b"cmd1"),
79                        args: Some(tokens_vec([b"arg1", b"arg2"])),
80                    }],
81                    ..Default::default()
82                })),
83                Command::ExecuteProcess(Box::new(ExecuteProcess {
84                    commands: vec![CustomCommand {
85                        name: token(b"cmd1"),
86                        args: None,
87                    }],
88                    encoding: Some(WindowsEncoding::None),
89                    ..Default::default()
90                })),
91                Command::ExecuteProcess(Box::new(ExecuteProcess {
92                    commands: vec![CustomCommand {
93                        name: token(b"cmd1"),
94                        args: None,
95                    }],
96                    encoding: Some(WindowsEncoding::Auto),
97                    ..Default::default()
98                })),
99                Command::ExecuteProcess(Box::new(ExecuteProcess {
100                    commands: vec![CustomCommand {
101                        name: token(b"cmd1"),
102                        args: None,
103                    }],
104                    encoding: Some(WindowsEncoding::Ansi),
105                    ..Default::default()
106                })),
107                Command::ExecuteProcess(Box::new(ExecuteProcess {
108                    commands: vec![CustomCommand {
109                        name: token(b"cmd1"),
110                        args: None,
111                    }],
112                    encoding: Some(WindowsEncoding::Oem),
113                    ..Default::default()
114                })),
115                Command::ExecuteProcess(Box::new(ExecuteProcess {
116                    commands: vec![CustomCommand {
117                        name: token(b"cmd1"),
118                        args: None,
119                    }],
120                    encoding: Some(WindowsEncoding::Utf8),
121                    ..Default::default()
122                })),
123                Command::ExecuteProcess(Box::new(ExecuteProcess {
124                    commands: vec![CustomCommand {
125                        name: token(b"cmd1"),
126                        args: None,
127                    }],
128                    encoding: Some(WindowsEncoding::Utf8),
129                    ..Default::default()
130                })),
131                Command::ExecuteProcess(Box::new(ExecuteProcess {
132                    commands: vec![CustomCommand {
133                        name: token(b"cmd1"),
134                        args: None,
135                    }],
136                    command_error_is_fatal: Some(ErrorFatal::Any),
137                    ..Default::default()
138                })),
139                Command::ExecuteProcess(Box::new(ExecuteProcess {
140                    commands: vec![CustomCommand {
141                        name: token(b"cmd1"),
142                        args: None,
143                    }],
144                    command_error_is_fatal: Some(ErrorFatal::Last),
145                    ..Default::default()
146                })),
147                Command::ExecuteProcess(Box::new(ExecuteProcess {
148                    commands: vec![
149                        CustomCommand {
150                            name: token(b"cmd1"),
151                            args: Some(tokens_vec([b"arg1", b"arg2"])),
152                        },
153                        CustomCommand {
154                            name: token(b"cmd2"),
155                            args: None,
156                        }
157                    ],
158                    working_directory: Some(token(b"working_directory1")),
159                    timeout: Some(token(b"timeout1")),
160                    result_variable: Some(token(b"result_variable1")),
161                    results_variable: Some(token(b"results_variable1")),
162                    output_variable: Some(token(b"output_variable1")),
163                    error_variable: Some(token(b"error_variable1")),
164                    input_file: Some(token(b"input_file1")),
165                    output_file: Some(token(b"output_file1")),
166                    error_file: Some(token(b"error_file1")),
167                    output_quiet: true,
168                    error_quiet: true,
169                    command_echo: Some(token(b"command_echo1")),
170                    output_strip_trailing_whitespace: true,
171                    error_strip_trailing_whitespace: true,
172                    encoding: Some(WindowsEncoding::Utf8),
173                    echo_output_variable: true,
174                    echo_error_variable: true,
175                    command_error_is_fatal: Some(ErrorFatal::Any),
176                })),
177            ])
178        )
179    }
180}