execute_command_macro_impl/
lib.rs1use execute_command_tokens::command_tokens;
8use proc_macro::TokenStream;
9use quote::quote;
10use syn::{parse_macro_input, LitStr};
11
12#[proc_macro]
13pub fn command(input: TokenStream) -> TokenStream {
14 let s = parse_macro_input!(input as LitStr).value();
15
16 let tokens = command_tokens(s);
17
18 let tokens_length = tokens.len();
19
20 let command = match tokens_length {
21 0 => {
22 quote! {
23 ::std::process::Command::new("")
24 }
25 },
26 1 => {
27 let program = &tokens[0];
28
29 quote! {
30 ::std::process::Command::new(#program)
31 }
32 },
33 _ => {
34 let program = &tokens[0];
35 let args = &tokens[1..];
36
37 quote! {
38 {
39 let mut command = ::std::process::Command::new(#program);
40
41 command.args(&[#(#args,)*]);
42
43 command
44 }
45 }
46 },
47 };
48
49 command.into()
50}