use crate::{Zeroize, ZeroizeOnDrop};
use core::ops::{Deref, DerefMut};
pub struct Zeroizing<T: Zeroize>(T);
impl<T: Zeroize> Zeroizing<T> {
pub fn new(value: T) -> Self {
Self(value)
}
}
impl<T: Zeroize> Deref for Zeroizing<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: Zeroize> DerefMut for Zeroizing<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<T: Zeroize> Drop for Zeroizing<T> {
fn drop(&mut self) {
self.0.zeroize();
}
}
impl<T: Zeroize> ZeroizeOnDrop for Zeroizing<T> {}