#![warn(missing_docs)]
#![no_std]
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(SecretDebug)]
pub fn derive_secret_debug(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let (impl_generics, ty_generics, _) = input.generics.split_for_impl();
let expanded = quote! {
impl #impl_generics core::fmt::Debug for #name #ty_generics {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "<Omitted secret>")
}
}
};
expanded.into()
}
#[proc_macro_derive(SecretDisplay)]
pub fn derive_secret_display(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let (impl_generics, ty_generics, _) = input.generics.split_for_impl();
let expanded = quote! {
impl #impl_generics core::fmt::Display for #name #ty_generics {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "<Omitted secret>")
}
}
};
expanded.into()
}
#[proc_macro_derive(SecretDrop)]
pub fn derive_secret_drop(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let (impl_generics, ty_generics, _) = input.generics.split_for_impl();
let expanded = quote! {
impl #impl_generics core::ops::Drop for #name #ty_generics {
fn drop(&mut self) {
self.zeroize()
}
}
};
expanded.into()
}