1use secrecy::{ExposeSecret, SecretBox};
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6pub struct SecretValue(SecretBox<Vec<u8>>);
17
18impl SecretValue {
19 pub fn new(bytes: Vec<u8>) -> Self {
21 Self(SecretBox::new(Box::new(bytes)))
22 }
23
24 pub fn expose(&self) -> &[u8] {
26 self.0.expose_secret()
27 }
28}
29
30impl From<String> for SecretValue {
31 fn from(s: String) -> Self {
32 Self::new(s.into_bytes())
33 }
34}
35
36impl From<&str> for SecretValue {
37 fn from(s: &str) -> Self {
38 Self::new(s.as_bytes().to_vec())
39 }
40}
41
42impl core::fmt::Debug for SecretValue {
44 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
45 f.write_str("SecretValue(REDACTED)")
46 }
47}
48
49impl PartialEq for SecretValue {
50 fn eq(&self, other: &Self) -> bool {
51 self.expose() == other.expose()
52 }
53}
54
55impl Serialize for SecretValue {
56 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
57 self.expose().serialize(serializer)
58 }
59}
60
61impl<'de> Deserialize<'de> for SecretValue {
62 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
63 let bytes = Vec::<u8>::deserialize(deserializer)?;
64 Ok(Self::new(bytes))
65 }
66}