lv2-urid-derive 1.0.1

Procedural macros for lv2-urid
Documentation
use proc_macro::TokenStream;
use syn::DeriveInput;
use syn::{parse_macro_input, Data, DataStruct};

pub fn urid_collection_derive_impl(input: TokenStream) -> TokenStream {
    let input: DeriveInput = parse_macro_input!(input);

    let struct_name = input.ident;

    let fields = match input.data {
        Data::Struct(DataStruct { fields, .. }) => fields,
        _ => panic!("Only structs can implement `URIDCollection`"),
    };

    let field_inits = fields
        .iter()
        .map(|field| field.ident.as_ref().unwrap())
        .map(|ident| quote! {#ident: map.populate_collection()?,});

    let implementation = quote! {
        impl ::lv2_urid::URIDCollection for #struct_name {
            fn from_map(map: &::lv2_urid::Map) -> Option<Self> {
                Some(Self {
                    #(#field_inits)*
                })
            }
        }
    };

    implementation.into()
}