bubbly-bub-test 0.3.1

Interactive mode extension crate to Command Line Arguments Parser (https://crates.io/crates/clap) (derive macros helper crate)
Documentation
extern crate proc_macro;

use quote::quote;
use syn;

#[derive(Debug, Clone)]
pub struct InteractiveClapAttrsContext {
    pub context_dir: Option<proc_macro2::TokenStream>,
    pub input_context_dir: Option<proc_macro2::TokenStream>,
    pub output_context_dir: Option<proc_macro2::TokenStream>,
    pub is_skip_default_from_cli: bool,
}

impl InteractiveClapAttrsContext {
    pub fn new(ast: &syn::DeriveInput) -> Self {
        let mut context_dir = quote!();
        let mut input_context_dir = quote!();
        let mut output_context_dir = quote!();
        let mut is_skip_default_from_cli = false;
        if !ast.attrs.is_empty() {
            for attr in ast.attrs.clone() {
                if attr.path.is_ident("interactive_clap") {
                    for attr_token in attr.tokens.clone() {
                        if let proc_macro2::TokenTree::Group(group) = attr_token {
                            if group.stream().to_string().contains("output_context") {
                                let group_stream =
                                    &group.stream().into_iter().collect::<Vec<_>>()[2..];
                                output_context_dir = quote! {#(#group_stream)*};
                            } else if group.stream().to_string().contains("input_context") {
                                let group_stream =
                                    &group.stream().into_iter().collect::<Vec<_>>()[2..];
                                input_context_dir = quote! {#(#group_stream)*};
                            } else if group.stream().to_string().contains("context") {
                                let group_stream =
                                    &group.stream().into_iter().collect::<Vec<_>>()[2..];
                                context_dir = quote! {#(#group_stream)*};
                            };
                            if group.stream().to_string().contains("skip_default_from_cli") {
                                is_skip_default_from_cli = true;
                            };
                        }
                    }
                };
            }
        };
        let context_dir: Option<proc_macro2::TokenStream> = if context_dir.is_empty() {
            None
        } else {
            Some(context_dir)
        };
        let input_context_dir: Option<proc_macro2::TokenStream> = if input_context_dir.is_empty() {
            None
        } else {
            Some(input_context_dir)
        };
        let output_context_dir: Option<proc_macro2::TokenStream> = if output_context_dir.is_empty()
        {
            None
        } else {
            Some(output_context_dir)
        };
        Self {
            context_dir,
            input_context_dir,
            output_context_dir,
            is_skip_default_from_cli,
        }
    }

    pub fn get_input_context_dir(self) -> proc_macro2::TokenStream {
        let context_dir = match self.context_dir {
            Some(context_dir) => context_dir,
            None => quote!(),
        };
        if !context_dir.is_empty() {
            return context_dir;
        };
        match self.input_context_dir {
            Some(input_context_dir) => input_context_dir,
            None => quote! {()},
        }
    }
}