use crate::provider::{
AuthToken, ConcurrencyLimit, ProviderError, Signature,
references::{
HasReference, InfisicalPath, InfisicalProjectId, InfisicalReference, InfisicalSecretType,
InfisicalSlug,
},
};
use async_trait::async_trait;
use clap::Args;
use locket_derive::LayeredConfig;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct InfisicalConfig {
pub infisical_url: url::Url,
pub infisical_client_secret: AuthToken,
pub infisical_client_id: Uuid,
pub infisical_default_path: InfisicalPath,
pub infisical_default_secret_type: InfisicalSecretType,
pub infisical_default_environment: Option<InfisicalSlug>,
pub infisical_default_project_id: Option<InfisicalProjectId>,
pub infisical_max_concurrent: ConcurrencyLimit,
}
impl HasReference for InfisicalConfig {
type Reference = InfisicalReference;
}
#[async_trait]
impl Signature for InfisicalConfig {
async fn signature(&self) -> Result<u64, ProviderError> {
self.infisical_client_secret.signature().await
}
}
#[derive(
Args, Debug, Clone, Default, LayeredConfig, Deserialize, Serialize, PartialEq, Eq, Hash,
)]
#[serde(rename_all = "kebab-case")]
#[locket(try_into = "InfisicalConfig")]
pub struct InfisicalArgs {
#[arg(long, env = "INFISICAL_URL")]
#[locket(default = "https://us.infisical.com")]
pub infisical_url: Option<url::Url>,
#[arg(long, env = "INFISICAL_CLIENT_SECRET", hide_env_values = true)]
pub infisical_client_secret: Option<AuthToken>,
#[arg(long, env = "INFISICAL_CLIENT_ID")]
pub infisical_client_id: Option<Uuid>,
#[arg(long, env = "INFISICAL_DEFAULT_ENVIRONMENT")]
pub infisical_default_environment: Option<InfisicalSlug>,
#[arg(long, env = "INFISICAL_DEFAULT_PROJECT_ID")]
pub infisical_default_project_id: Option<InfisicalProjectId>,
#[arg(long, env = "INFISICAL_DEFAULT_PATH")]
#[locket(default = "/")]
pub infisical_default_path: Option<InfisicalPath>,
#[arg(long, env = "INFISICAL_DEFAULT_SECRET_TYPE")]
#[locket(default = InfisicalSecretType::Shared)]
pub infisical_default_secret_type: Option<InfisicalSecretType>,
#[arg(long, env = "INFISICAL_MAX_CONCURRENT")]
#[locket(default = ConcurrencyLimit::new(20))]
pub infisical_max_concurrent: Option<ConcurrencyLimit>,
}