1use proc_macro::TokenStream;
9use proc_macro::TokenTree;
10
11#[proc_macro]
12pub fn parser_from_str(input: TokenStream) -> TokenStream {
13 let program = r#"env!("CARGO_BIN_NAME")"#;
14 let version = r#"env!("CARGO_PKG_VERSION")"#;
15
16 let mut usage = String::new();
17
18 for tt in input.into_iter() {
19 match tt {
20 TokenTree::Literal(value) => {
21 usage = value.to_string();
22 break;
23 }
24 _ => {}
25 }
26 }
27
28 if !usage.is_empty() {
29 usage = format!("parser.set_usage(String::from({}))", usage);
30 }
31
32 let output = format!(
33 r#"{{
34 let mut parser = cmdargs::Parser::new();
35 parser.set_program({});
36 parser.set_version({});
37 {};
38 parser
39 }}"#,
40 program, version, usage,
41 );
42
43 output.parse().unwrap()
46}