extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, Data, DeriveInput, Fields, Visibility};
#[proc_macro_derive(CS453Getters)]
pub fn cs453_getters(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let struct_name = &input.ident;
if let Visibility::Public(_) = input.vis {
let mut getter_code = String::new();
if let Data::Struct(data_struct) = &input.data {
if let Fields::Named(named_fields) = &data_struct.fields {
for field in &named_fields.named {
let field_name = &field.ident;
let field_type = &field.ty;
if field_name.is_some() {
let getter_method = format!(
"pub fn {}_cs453(&self) -> &{} {{ &self.{} }}\n",
field_name.as_ref().unwrap(),
quote!(#field_type).to_string(),
field_name.as_ref().unwrap()
);
getter_code.push_str(&getter_method);
}
}
}
}
let expanded = quote! {
impl #struct_name {
#getter_code
}
};
expanded.into()
} else {
TokenStream::from(quote! {
compile_error!("CS453Getters only supports public structs.");
})
}
}