cmdargs_macros/
lib.rs

1// cmdargs - Command line argument parser for Rust
2//
3// Copyright waived 2022, Everaldo Canuto <everaldo.canuto@gmail.com>
4//
5// The contents of this file is free and unencumbered software released into the
6// public domain. For more information, please refer to <http://unlicense.org/>
7
8use 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    // eprintln!("{}", output);
44
45    output.parse().unwrap()
46}