struct-input-derive 0.1.1

Procedural derive macro for the struct-input crate, enabling automatic mapping of CLI inputs to struct fields.
Documentation
mod attr;
mod util;

use proc_macro::TokenStream;
use darling::{FromDeriveInput, FromField, FromMeta};
use darling::export::syn::{self, Data, DeriveInput, Field, Fields, Token};
use darling::export::syn::punctuated::Punctuated;
use quote::quote;
use attr::{FieldArgs, StructArgs};

pub fn impl_struct_input(ast: &DeriveInput) -> TokenStream {

    let name = &ast.ident;

    let fields = get_field(&ast.data);
    let struct_args = StructArgs::from_derive_input(ast).unwrap();
    let fields_args = fields.iter()
        .map(|f| FieldArgs::from_field(f).unwrap())
        .collect::<Vec<_>>();

    let field_assignments = fields_args.iter().map(|f| {
        util::field_to_quote(f)
    });

    let result = quote! {
        impl ::struct_input::StructInputTrait for #name {
            async fn from_input() -> Self {
                Self {
                    #( #field_assignments ),*
                }
            }
        }
    };

    result.into()
}


fn get_field(data: &Data) -> &Punctuated<Field, Token![,]> {
    if let Data::Struct(syn::DataStruct {
         fields: Fields::Named(syn::FieldsNamed { named, .. }),
         ..
     }) = data {
        named
    } else {
        panic!("This macro can only be used on structs with named fields.");
    }
}