mod cached;
mod providers;
pub mod encodings;
use secrecy::ExposeSecret as _;
use serde::{Deserialize, Serialize};
use crate::platform::{MaybeSend, MaybeSendSync};
pub use cached::CachedSecret;
pub use encodings::{DecodingError, SecretDecoder};
pub use providers::EnvVarSecret;
#[derive(Debug, Clone)]
pub struct SecretString(secrecy::SecretString);
impl<'de> Deserialize<'de> for SecretString {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Ok(Self::new(s))
}
}
impl Serialize for SecretString {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(self.0.expose_secret())
}
}
impl SecretString {
#[must_use]
pub fn new(secret: impl AsRef<str>) -> Self {
SecretString(secret.as_ref().into())
}
#[must_use]
pub fn expose_secret(&self) -> &str {
self.0.expose_secret()
}
}
#[derive(Debug, Clone)]
pub struct SecretBytes(secrecy::SecretBox<[u8]>);
impl SecretBytes {
#[must_use]
pub fn new(secret: Vec<u8>) -> Self {
SecretBytes(secrecy::SecretBox::new(secret.into_boxed_slice()))
}
#[must_use]
pub fn expose_secret(&self) -> &[u8] {
self.0.expose_secret()
}
}
#[derive(Debug, Clone)]
pub struct SecretOutput<T: Clone> {
pub value: T,
pub identity: Option<String>,
}
pub trait Secret: Clone + MaybeSendSync {
type Error: crate::Error;
type Output: Clone + MaybeSendSync;
fn get_secret_value(
&self,
) -> impl Future<Output = Result<SecretOutput<Self::Output>, Self::Error>> + MaybeSend;
}