interactive_clap_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use proc_macro_error::proc_macro_error;
5
6#[macro_use]
7mod debug;
8
9mod derives;
10mod helpers;
11#[cfg(test)]
12mod tests;
13
14/// `#[interactive_clap(...)]` attribute used for specifying multiple values with `Vec<..>` type,
15/// by repeating corresponding flag `--field-name` (kebab case) for each value
16///
17/// implies `#[interactive_clap(long)]`
18///
19/// implies `#[interactive_clap(skip_interactive_input)]`, as it's not intended for interactive input
20pub(crate) const LONG_VEC_MUTLIPLE_OPT: &str = "long_vec_multiple_opt";
21
22/// `#[interactive_clap(...)]` attribute which translates 1-to-1 into
23/// `#[clap(verbatim_doc_comment)]`
24/// More info on <https://docs.rs/clap/4.5.23/clap/_derive/index.html#command-attributes>
25pub(crate) const VERBATIM_DOC_COMMENT: &str = "verbatim_doc_comment";
26
27#[proc_macro_derive(InteractiveClap, attributes(interactive_clap))]
28#[proc_macro_error]
29pub fn interactive_clap(input: TokenStream) -> TokenStream {
30    let ast = syn::parse_macro_input!(input);
31    derives::interactive_clap::impl_interactive_clap(&ast).into()
32}
33
34#[proc_macro_derive(ToCliArgs, attributes(to_cli_args))]
35#[proc_macro_error]
36pub fn to_cli_args(input: TokenStream) -> TokenStream {
37    let ast = syn::parse_macro_input!(input);
38    derives::to_cli_args::impl_to_cli_args(&ast).into()
39}