rusty_vault 0.2.1

RustyVault is a powerful identity-based secrets management software, providing features such as cryptographic key management, encryption as a service, public key cryptography, certificates management, identity credentials management and so forth. RustyVault's RESTful API is designed to be fully compatible with Hashicorp Vault.
Documentation
use derive_more::Deref;
use serde_json::json;

use super::{secret::SecretAuth, Client, HttpResponse};

use crate::{
    errors::RvError,
    http::sys::InitRequest,
};

use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Secret {
    #[serde(default)]
    pub request_id: String,
    #[serde(default)]
    pub lease_id: String,
    #[serde(default)]
    pub lease_duration: u32,
    #[serde(default)]
    pub renewable: bool,
    #[serde(default)]
    pub data: Map<String, Value>,
    #[serde(default)]
    pub auth: Option<SecretAuth>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MountOutput {
    #[serde(default)]
    pub uuid: String,
    #[serde(default, rename = "type")]
    pub logical_type: String,
    #[serde(default)]
    pub accessor: String,
    #[serde(default)]
    pub description: String,
    #[serde(default)]
    pub plugin_version: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthInput {
    #[serde(default)]
    pub path: String,
    #[serde(default, rename = "type")]
    pub logical_type: String,
    #[serde(default)]
    pub description: String,
    #[serde(default)]
    pub options: Map<String, Value>,
}

#[derive(Deref)]
pub struct Sys<'a> {
    #[deref]
    pub client: &'a Client,
}

impl Client {
    pub fn sys(&self) -> Sys {
        Sys {
            client: self
        }
    }
}

impl Sys<'_> {
    pub fn init(&self, init_req: &InitRequest) -> Result<HttpResponse, RvError> {
        let data = json!({
            "secret_shares": init_req.secret_shares,
            "secret_threshold": init_req.secret_threshold,
        });

        self.request_put("/v1/sys/init", data.as_object().cloned())
    }

    pub fn seal_status(&self) -> Result<HttpResponse, RvError> {
        self.request_read("/v1/sys/seal-status")
    }

    pub fn seal(&self) -> Result<HttpResponse, RvError> {
        self.request_put("/v1/sys/seal", None)
    }

    pub fn unseal(&self, key: &str) -> Result<HttpResponse, RvError> {
        let data = json!({
            "key": key,
        });

        self.request_put("/v1/sys/unseal", data.as_object().cloned())
    }

    pub fn list_auth(&self) -> Result<HttpResponse, RvError> {
        self.request_read("/v1/sys/auth")
    }

    pub fn enable_auth(&self, input: &AuthInput) -> Result<HttpResponse, RvError> {
        let data = serde_json::to_value(input)?;
        self.request_write(&format!("/v1/sys/auth/{}", &input.path), data.as_object().cloned())
    }

    pub fn disable_auth(&self, path: &str) -> Result<HttpResponse, RvError> {
        self.request_delete(&format!("/v1/sys/auth/{}", path), None)
    }

    pub fn remount(&self, from: &str, to: &str) -> Result<HttpResponse, RvError> {
        let data = json!({
            "from": from,
            "to": to,
        });

        self.request_write("/v1/sys/remount", data.as_object().cloned())
    }
}