stdin_parser_derive 0.1.0

Parse stdin by defining a struct - trait derive
Documentation
use crate::common;
use quote::quote;

fn default_field_description(field: &syn::Field) -> String {
    field.ident.as_ref().unwrap().to_string()
}

fn get_field_description(field: &syn::Field) -> String {
    common::get_description(&field.attrs).unwrap_or_else(|| default_field_description(field))
}

pub(crate) fn derive(_ty: &syn::Ident, data: &syn::DataStruct) -> proc_macro2::TokenStream {
    let field_names: Vec<_> = data
        .fields
        .iter()
        .map(|field| {
            field
                .ident
                .as_ref()
                .expect("StdinParser only works with names fields")
        })
        .collect();

    let field_descriptions: Vec<_> = data.fields.iter().map(get_field_description).collect();

    let fields_parsers: Vec<_> = field_names
        .iter()
        .zip(field_descriptions.iter())
        .map(|(field_name, field_description)| {
            quote! {
                println!("{}", #field_description);
                let #field_name = StdinParser::parse_stdin()?;
            }
        })
        .collect();

    quote! {
        #(#fields_parsers)*

        Ok(Self{
                #(#field_names, )*
        })
    }
}