fn generate_body()

in sdk/typespec/typespec_macros/src/safe_debug.rs [25:65]


fn generate_body(ast: DeriveInput) -> Result<TokenStream> {
    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
    let name = &ast.ident;

    let body = match &ast.data {
        Data::Enum(DataEnum { variants, .. }) => {
            let variants = variants.iter().map(|v| {
                let variant_name = &v.ident;
                let path = to_path(&[name, variant_name]);

                generate_fields(&path, &v.fields)
            });

            quote! {
                match self {
                    #(#variants),*
                }
            }
        }
        Data::Struct(DataStruct { fields, .. }) => {
            let path = to_path(&[name]);
            let fields = generate_fields(&path, fields);

            quote! {
                match self {
                    #fields
                }
            }
        }
        _ => return Err(Error::new(ast.span(), "type not supported for `SafeDebug`")),
    };

    Ok(quote! {
        #[automatically_derived]
        impl #impl_generics ::std::fmt::Debug for #name #ty_generics #where_clause {
            fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
                #body
            }
        }
    })
}