ockam_command 0.150.0

End-to-end encryption and mutual authentication for distributed applications.
use colorful::Colorful;
use indoc::formatdoc;

use ockam_api::cli_state::vaults::NamedVault;
use ockam_api::cli_state::{UseAwsKms, VaultType};
use ockam_api::colors::OckamColor;
use ockam_api::output::{indent, Output};

#[derive(serde::Serialize)]
pub struct VaultOutput {
    vault: NamedVault,
}

impl VaultOutput {
    pub fn new(vault: &NamedVault) -> Self {
        Self {
            vault: vault.clone(),
        }
    }

    pub fn name(&self) -> String {
        self.vault.name().clone()
    }
}

impl Output for VaultOutput {
    fn item(&self) -> ockam_api::Result<String> {
        Ok(formatdoc!(
            r#"
            Vault:
            {vault}
            "#,
            vault = indent("   ", self.as_list_item()?)
        ))
    }

    fn as_list_item(&self) -> ockam_api::Result<String> {
        let name = self
            .vault
            .name()
            .to_string()
            .color(OckamColor::PrimaryResource.color());

        let vault_type = if self.vault.path().is_some() {
            "External"
        } else {
            "Internal"
        }
        .to_string()
        .color(OckamColor::PrimaryResource.color());

        let uses_aws_kms = if self.vault.use_aws_kms() {
            "true"
        } else {
            "false"
        }
        .to_string()
        .color(OckamColor::PrimaryResource.color());

        Ok(match self.vault.vault_type() {
            VaultType::DatabaseVault {
                use_aws_kms: UseAwsKms::No,
            } => formatdoc!(
                r#"Name: {name}
                   Type: {vault_type}"#,
                name = name,
                vault_type = vault_type
            ),
            VaultType::DatabaseVault {
                use_aws_kms: UseAwsKms::Yes,
            } => formatdoc!(
                r#"Name: {name}
            Type: {vault_type}
            Uses AWS KMS: {uses_aws_kms}"#,
                name = name,
                uses_aws_kms = uses_aws_kms
            ),
            VaultType::LocalFileVault {
                path,
                use_aws_kms: UseAwsKms::No,
            } => formatdoc!(
                r#"Name: {name}
            Type: {vault_type}
            Path: {vault_path}"#,
                name = name,
                vault_type = vault_type,
                vault_path = path
                    .to_string_lossy()
                    .to_string()
                    .color(OckamColor::PrimaryResource.color())
            ),
            VaultType::LocalFileVault {
                path,
                use_aws_kms: UseAwsKms::Yes,
            } => formatdoc!(
                r#"Name: {name}
            Type: External
            Path: {vault_path}
            Uses AWS KMS: {uses_aws_kms}"#,
                name = name,
                vault_path = path
                    .to_string_lossy()
                    .to_string()
                    .color(OckamColor::PrimaryResource.color()),
                uses_aws_kms = uses_aws_kms,
            ),
        })
    }
}