use proc_macro2::{Ident, TokenStream};
use quote::quote;
use syn::{Generics, Type, WherePredicate, parse_quote};
fn with_structural_bounds(
ident: &Ident,
generics: &Generics,
crate_root: &TokenStream,
) -> Generics {
let mut bounded = generics.clone();
let (_, ty_generics, _) = generics.split_for_impl();
let self_ty: Type = parse_quote!(#ident #ty_generics);
let predicate: WherePredicate = parse_quote!(
#self_ty: #crate_root::Redactable + ::core::clone::Clone + #crate_root::__private::serde::Serialize
);
bounded.make_where_clause().predicates.push(predicate);
bounded
}
pub(crate) fn structural_to_redacted_impl(
ident: &Ident,
generics: &Generics,
crate_root: &TokenStream,
) -> TokenStream {
let bounded = with_structural_bounds(ident, generics, crate_root);
let (impl_generics, ty_generics, where_clause) = bounded.split_for_impl();
quote! {
impl #impl_generics #crate_root::ToRedacted for #ident #ty_generics #where_clause {
fn to_redacted(&self) -> #crate_root::RedactedValue {
#crate_root::__private::generated_redacted_json(self)
}
}
}
}
pub(crate) fn display_to_redacted_impl(
ident: &Ident,
generics: &Generics,
crate_root: &TokenStream,
) -> TokenStream {
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
quote! {
impl #impl_generics #crate_root::ToRedacted for #ident #ty_generics #where_clause {
fn to_redacted(&self) -> #crate_root::RedactedValue {
#crate_root::__private::generated_redacted_display(self)
}
}
}
}
pub(crate) fn dual_to_redacted_impl(
ident: &Ident,
display_generics: &Generics,
crate_root: &TokenStream,
) -> TokenStream {
let bounded = with_structural_bounds(ident, display_generics, crate_root);
let (impl_generics, ty_generics, where_clause) = bounded.split_for_impl();
quote! {
impl #impl_generics #crate_root::ToRedacted for #ident #ty_generics #where_clause {
fn to_redacted(&self) -> #crate_root::RedactedValue {
#crate_root::__private::generated_redacted_dual(self)
}
}
}
}
pub(crate) fn not_sensitive_to_redacted_impl(
ident: &Ident,
generics: &Generics,
crate_root: &TokenStream,
) -> TokenStream {
let mut bounded = generics.clone();
let (_, ty_generics, _) = generics.split_for_impl();
let self_ty: Type = parse_quote!(#ident #ty_generics);
let predicate: WherePredicate =
parse_quote!(#self_ty: #crate_root::__private::serde::Serialize);
bounded.make_where_clause().predicates.push(predicate);
let (impl_generics, ty_generics, where_clause) = bounded.split_for_impl();
quote! {
impl #impl_generics #crate_root::ToRedacted for #ident #ty_generics #where_clause {
fn to_redacted(&self) -> #crate_root::RedactedValue {
#crate_root::__private::generated_declared_json(self)
}
}
}
}