vault-client-rs 0.8.0

A Rust client for the HashiCorp Vault HTTP API
Documentation
use std::fmt;

use secrecy::{ExposeSecret, SecretString};
use serde::{Deserialize, Serialize};
use zeroize::{Zeroize, ZeroizeOnDrop};

use super::redaction::redact;

#[derive(Debug, Serialize, Default, Zeroize, ZeroizeOnDrop)]
pub struct ConsulConfigRequest {
    pub address: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub scheme: Option<String>,
    #[serde(
        serialize_with = "super::serde_secret::serialize_option",
        skip_serializing_if = "Option::is_none"
    )]
    pub token: Option<SecretString>,
}

impl Clone for ConsulConfigRequest {
    fn clone(&self) -> Self {
        Self {
            address: self.address.clone(),
            scheme: self.scheme.clone(),
            token: self.token.clone(),
        }
    }
}

#[derive(Debug, Deserialize, Clone)]
#[non_exhaustive]
pub struct ConsulConfig {
    #[serde(default)]
    pub address: String,
    #[serde(default)]
    pub scheme: String,
}

#[derive(Debug, Serialize, Default, Clone)]
pub struct ConsulRoleRequest {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub consul_policies: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub consul_roles: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub service_identities: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub node_identities: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub consul_namespace: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub partition: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ttl: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_ttl: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub local: Option<bool>,
}

#[derive(Debug, Deserialize, Clone)]
#[non_exhaustive]
pub struct ConsulRole {
    #[serde(default)]
    pub consul_policies: Vec<String>,
    #[serde(default)]
    pub consul_roles: Vec<String>,
    #[serde(default)]
    pub service_identities: Vec<String>,
    #[serde(default)]
    pub node_identities: Vec<String>,
    #[serde(default)]
    pub ttl: u64,
    #[serde(default)]
    pub max_ttl: u64,
    #[serde(default)]
    pub local: bool,
}

#[derive(Deserialize, Zeroize, ZeroizeOnDrop)]
#[non_exhaustive]
pub struct ConsulCredentials {
    pub token: SecretString,
}

impl Clone for ConsulCredentials {
    fn clone(&self) -> Self {
        Self {
            token: self.token.clone(),
        }
    }
}

impl From<SecretString> for ConsulCredentials {
    fn from(token: SecretString) -> Self {
        Self { token }
    }
}

impl From<&str> for ConsulCredentials {
    fn from(token: &str) -> Self {
        Self {
            token: SecretString::from(token.to_owned()),
        }
    }
}

impl fmt::Debug for ConsulCredentials {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("ConsulCredentials")
            .field("token", &redact(self.token.expose_secret()))
            .finish()
    }
}