cs453getters 0.1.0

Just an assignment...
Documentation
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 {
    // 解析输入为DeriveInput结构
    let input = parse_macro_input!(input as DeriveInput);

    // 获取结构体的名称
    let struct_name = &input.ident;

    // 检查结构体是否是pub(公开可见)
    if let Visibility::Public(_) = input.vis {
        // 用于存储getter方法代码的字符串
        let mut getter_code = String::new();

        // 生成getter方法代码
        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() {
                        // 生成getter方法并添加到getter_code字符串中
                        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);
                    }
                }
            }
        }

        // 将getter代码包装在impl块中
        let expanded = quote! {
            impl #struct_name {
                #getter_code
            }
        };

        // 返回生成的代码作为TokenStream
        expanded.into()
    } else {
        // 如果结构体不是公开可见,返回错误信息
        TokenStream::from(quote! {
            compile_error!("CS453Getters only supports public structs.");
        })
    }
}