extruct-macros 0.2.1

Implementation detail of the `extruct` crate. Use https://crates.io/crates/extruct in your code.
Documentation
use crate::fields::Model;
use proc_macro2::TokenStream;
use quote::quote;

pub(crate) type Rust = TokenStream;

pub(crate) fn codegen(model: Model) -> Rust {
    let Model {
        ident,
        generics,
        fields,
    } = model;
    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    quote!(
        impl #impl_generics extruct::Fields for #ident #ty_generics #where_clause {
            fn fields() -> &'static [&'static str] {
                &[#(#fields,)*]
            }
        }
    )
}

#[cfg(test)]
mod tests {
    use super::*;
    use syn::{parse_quote, ItemImpl};

    #[test]
    fn output_is_impl_block() {
        let model = Model {
            ident: parse_quote!(SomeStruct),
            generics: parse_quote!(<T, E, const N: usize>),
            fields: vec!["first".to_owned(), "second".to_owned()],
        };
        let rust = codegen(model);

        assert!(syn::parse2::<ItemImpl>(rust).is_ok());
    }
}