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());
}
}