use proc_macro2::TokenStream;
use quote::quote;
use syn::{
DeriveInput,
Generics,
Path,
};
use crate::container_attributes::ContainerAttributes;
pub(crate) fn expand(
input: &DeriveInput,
runtime: &Path,
attributes: &ContainerAttributes,
generics: &Generics,
) -> TokenStream {
let name = &input.ident;
let (impl_generics, type_generics, where_clause) =
generics.split_for_impl();
let debug_impl = attributes.debug_enabled().then(|| {
quote! {
impl #impl_generics ::core::fmt::Debug for #name #type_generics #where_clause {
#[inline(always)]
fn fmt(
&self,
formatter: &mut ::core::fmt::Formatter<'_>,
) -> ::core::fmt::Result {
let redacted = <Self as #runtime::Redact>::redacted(self);
::core::fmt::Debug::fmt(&redacted, formatter)
}
}
}
});
let display_impl = attributes.display_enabled().then(|| {
quote! {
impl #impl_generics ::core::fmt::Display for #name #type_generics #where_clause {
#[inline(always)]
fn fmt(
&self,
formatter: &mut ::core::fmt::Formatter<'_>,
) -> ::core::fmt::Result {
let redacted = <Self as #runtime::Redact>::redacted(self);
::core::fmt::Display::fmt(&redacted, formatter)
}
}
}
});
quote! {
#debug_impl
#display_impl
}
}