binstalk_types/
secrets.rs1use 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>>;