cmake_parser/doc/command/project/
try_run.rs1use cmake_parser_derive::CMake;
2
3use crate::{
4 command::common::{
5 CopyFile, LangExtensions, LangStandard, LangStandardRequired, Source, SourceAlt,
6 },
7 doc::command_scope::{CommandScope, ToCommandScope},
8 Token,
9};
10
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
15#[cmake(pkg = "crate", untagged)]
16pub enum TryRun<'t> {
17 Regular(TryRunRegular<'t>),
18 Alt(TryRunAlt<'t>),
19}
20
21impl<'t> ToCommandScope for TryRun<'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", default = "sources")]
29pub struct TryRunRegular<'t> {
30 #[cmake(positional)]
31 pub run_result_var: Token<'t>,
32 #[cmake(positional)]
33 pub compile_result_var: Token<'t>,
34
35 #[cmake(rename = "")]
36 pub sources: Vec<Source<'t>>,
37
38 pub log_description: Option<Token<'t>>,
39 pub no_cache: bool,
40 pub no_log: bool,
41 pub cmake_flags: Option<Vec<Token<'t>>>,
42 pub compile_definitions: Option<Vec<Token<'t>>>,
43 pub link_options: Option<Vec<Token<'t>>>,
44 pub link_libraries: Option<Vec<Token<'t>>>,
45 pub compile_output_variable: Option<Token<'t>>,
46 pub copy_file: Option<CopyFile<'t>>,
47 pub lang_standard: Option<LangStandard<'t>>,
48 pub lang_standard_required: Option<LangStandardRequired<'t>>,
49 pub lang_extensions: Option<LangExtensions<'t>>,
50
51 pub run_output_variable: Option<Token<'t>>,
52 pub run_output_stdout_variable: Option<Token<'t>>,
53 pub run_output_stderr_variable: Option<Token<'t>>,
54 pub working_directory: Option<Token<'t>>,
55 pub args: Option<Vec<Token<'t>>>,
56}
57
58#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
59#[cmake(pkg = "crate", default = "sources")]
60pub struct TryRunAlt<'t> {
61 #[cmake(positional)]
62 pub run_result_var: Token<'t>,
63 #[cmake(positional)]
64 pub compile_result_var: Token<'t>,
65 #[cmake(positional)]
66 pub binary_dir: Token<'t>,
67
68 #[cmake(rename = "")]
69 pub sources: SourceAlt<'t>,
70
71 pub cmake_flags: Option<Vec<Token<'t>>>,
72 pub compile_definitions: Option<Vec<Token<'t>>>,
73 pub link_options: Option<Vec<Token<'t>>>,
74 pub link_libraries: Option<Vec<Token<'t>>>,
75 pub compile_output_variable: Option<Token<'t>>,
76 pub copy_file: Option<CopyFile<'t>>,
77 pub lang_standard: Option<LangStandard<'t>>,
78 pub lang_standard_required: Option<LangStandardRequired<'t>>,
79 pub lang_extensions: Option<LangExtensions<'t>>,
80
81 pub run_output_variable: Option<Token<'t>>,
82 pub output_variable: Option<Token<'t>>,
83 pub working_directory: Option<Token<'t>>,
84 pub args: Option<Vec<Token<'t>>>,
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90 use crate::doc::cmake_parse::tests::token;
91 use crate::*;
92 use pretty_assertions::assert_eq;
93
94 #[test]
95 fn try_run() {
96 let src = include_bytes!("../../../../../fixture/commands/project/try_run");
97 let cmakelists = parse_cmakelists(src).unwrap();
98 let doc = Doc::from(cmakelists);
99 assert_eq!(
100 doc.commands(),
101 Ok(vec![Command::TryRun(Box::new(TryRun::Alt(TryRunAlt {
102 run_result_var: token(b"test_run_result"),
103 compile_result_var: token(b"test_compile_result"),
104 binary_dir: token(b"${CMAKE_CURRENT_BINARY_DIR}/"),
105 sources: SourceAlt::Source(token(b"${CMAKE_CURRENT_SOURCE_DIR}/test.cpp")),
106 cmake_flags: None,
107 compile_definitions: None,
108 link_options: None,
109 link_libraries: None,
110 compile_output_variable: Some(token(b"test_compile_output")),
111 copy_file: None,
112 lang_standard: None,
113 lang_standard_required: None,
114 lang_extensions: None,
115 run_output_variable: Some(token(b"test_run_output")),
116 output_variable: None,
117 working_directory: None,
118 args: None,
119 }))),])
120 )
121 }
122}