execute_command_macro_impl/
lib.rs

1/*!
2# Execute Command Macro Impl
3
4See [`execute-command-macro`](https://crates.io/crates/execute-command-macro).
5*/
6
7use 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}