use serde::Serializer;
use zeroize::Zeroizing;
pub struct SecretString {
inner: Zeroizing<String>,
}
impl SecretString {
#[must_use]
pub fn new(value: String) -> Self {
Self {
inner: Zeroizing::new(value),
}
}
#[must_use]
pub fn expose_secret(&self) -> &str {
&self.inner
}
}
impl std::fmt::Debug for SecretString {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "SecretString([REDACTED])")
}
}
impl serde::Serialize for SecretString {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str("[REDACTED]")
}
}
pub struct SecretBytes {
inner: Zeroizing<Vec<u8>>,
}
impl SecretBytes {
#[must_use]
pub fn new(value: Vec<u8>) -> Self {
Self {
inner: Zeroizing::new(value),
}
}
#[must_use]
pub fn expose_secret(&self) -> &[u8] {
&self.inner
}
}
impl std::fmt::Debug for SecretBytes {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "SecretBytes([REDACTED] {} bytes)", self.inner.len())
}
}
impl serde::Serialize for SecretBytes {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str("[REDACTED]")
}
}
pub struct ApiToken {
inner: Zeroizing<String>,
}
impl ApiToken {
#[must_use]
pub fn new(value: String) -> Self {
Self {
inner: Zeroizing::new(value),
}
}
#[must_use]
pub fn expose_secret(&self) -> &str {
&self.inner
}
}
impl std::fmt::Debug for ApiToken {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ApiToken([REDACTED])")
}
}
pub struct DbPassword {
inner: Zeroizing<String>,
}
impl DbPassword {
#[must_use]
pub fn new(value: String) -> Self {
Self {
inner: Zeroizing::new(value),
}
}
#[must_use]
pub fn expose_secret(&self) -> &str {
&self.inner
}
}
impl std::fmt::Debug for DbPassword {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "DbPassword([REDACTED])")
}
}
pub struct SigningKeyRef {
inner: Zeroizing<String>,
}
impl SigningKeyRef {
#[must_use]
pub fn new(value: String) -> Self {
Self {
inner: Zeroizing::new(value),
}
}
#[must_use]
pub fn expose_secret(&self) -> &str {
&self.inner
}
}
impl std::fmt::Debug for SigningKeyRef {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "SigningKeyRef([REDACTED])")
}
}