use std::fmt;
#[derive(Clone)]
pub struct Secret<T> {
value: T,
}
impl<T> Secret<T> {
#[must_use]
pub fn new(value: T) -> Self {
Self { value }
}
#[must_use]
pub fn expose(&self) -> &T {
&self.value
}
#[must_use]
pub fn into_inner(self) -> T {
self.value
}
}
impl<T> fmt::Debug for Secret<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("Secret([REDACTED])")
}
}
impl<T> fmt::Display for Secret<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("[REDACTED]")
}
}
impl<T> From<T> for Secret<T> {
fn from(value: T) -> Self {
Self::new(value)
}
}
#[cfg(test)]
#[path = "secret_value.test.rs"]
mod tests;