getter 0.2.0

生成get方法
Documentation
use super::{DefaultValue, GetterField};
use crate::DefaultValue::Value;
use proc_macro2::{Ident, Span, TokenStream as TokenStream2};
use proc_macro_error2::abort_call_site;
use quote::quote;
use syn::{self, ext::IdentExt};


pub fn implement(field: &GetterField) -> TokenStream2 {
    let field_name = field
        .ident
        .clone()
        .unwrap_or_else(|| abort_call_site!("没有字段名字"));

    let fn_name = if field_name.to_string().starts_with("r#") {
        field_name.clone()
    } else {
        Ident::new(&format!("{}", field_name.unraw()), Span::call_site())
    };
    let field_ty = &field.ty;
    let inner_type = &field.inner_type;

    let primitive = field.is_primitive;
    let string = field.is_string;

    let ty = match inner_type {
        Some(inner_type) => {
            if primitive || string {
                inner_type
            } else {
                field_ty
            }
        },
        None => field_ty,
    };


    let return_ty = if primitive {
        quote! {#ty}
    } else if string {
        quote! {&str}
    } else {
        quote! {&#ty}
    };

    let content = if field.is_option {
        if !(primitive || string) {
            quote! {
                &self.#field_name
            }
        } else {
            let default_value = &field.default;
            let default_value = default_value.as_ref().unwrap_or(&DefaultValue::NoValue);
            match default_value {
                Value(default) => {
                    if primitive {
                        quote! {
                        self.#field_name.unwrap_or(#default)
                    }
                    } else if string {
                        quote! {
                        &self.#field_name.as_deref().unwrap_or(#default)
                    }
                    } else {
                        quote! {
                        &self.#field_name.unwrap_or(&#default)
                    }
                    }
                }
                _ => {
                    if primitive {
                        quote! {
                        self.#field_name.unwrap_or_default()
                    }
                    } else if string {
                        quote! {
                        &self.#field_name.as_deref().unwrap_or("")
                    }
                    } else {
                        quote! {
                        &self.#field_name.unwrap_or_default()
                    }
                    }
                }
            }
        }

    } else {
        if primitive {
            quote! {
                self.#field_name
            }
        } else {
            quote! {
                &self.#field_name
            }
        }
    };

    let pri = field.pri;
    let visibility = if pri {
        quote! {}
    } else {
        quote! {
            pub
        }
    };
    quote! {
        #[inline(always)]
        #visibility fn #fn_name(&self) -> #return_ty {
            #content
        }
    }
}