Skip to main content

binstalk_types/
secrets.rs

1use std::{
2    fmt,
3    ops::{Deref, DerefMut},
4};
5
6use zeroize::Zeroizing;
7
8#[repr(transparent)]
9#[derive(Clone, Default)]
10pub struct Redacted<T>(T);
11
12impl<T> Redacted<T> {
13    pub const fn new(value: T) -> Self {
14        Self(value)
15    }
16}
17
18impl Redacted<Zeroizing<String>> {
19    pub fn from_string(value: String) -> Self {
20        Self::new(Zeroizing::new(value))
21    }
22
23    pub fn from_boxed_str(value: Box<str>) -> Self {
24        Self::from_string(value.into())
25    }
26}
27
28impl<T> Deref for Redacted<T> {
29    type Target = T;
30
31    fn deref(&self) -> &Self::Target {
32        &self.0
33    }
34}
35
36impl<T> DerefMut for Redacted<T> {
37    fn deref_mut(&mut self) -> &mut Self::Target {
38        &mut self.0
39    }
40}
41
42impl<T> fmt::Debug for Redacted<T> {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        f.write_str("<redacted>")
45    }
46}
47
48pub type SecretString = Redacted<Zeroizing<String>>;