use crate::health::StatusFile;
use crate::logging::{Logger, LoggerArgs};
use crate::provider::{Provider, ProviderArgs};
use crate::secrets::{SecretManagerArgs, SecretManagerConfig};
use crate::watch::DebounceDuration;
use clap::{Args, ValueEnum};
use locket_derive::LayeredConfig;
use serde::{Deserialize, Serialize};
#[derive(Default, Copy, Clone, Debug, ValueEnum, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum InjectMode {
#[default]
OneShot,
Watch,
Park,
}
impl std::fmt::Display for InjectMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.to_possible_value()
.expect("no values are skipped")
.get_name()
.fmt(f)
}
}
#[derive(Debug, Clone)]
pub struct InjectConfig {
pub mode: InjectMode,
pub status_file: Option<StatusFile>,
pub manager: SecretManagerConfig,
pub provider: Provider,
pub debounce: DebounceDuration,
pub logger: Logger,
}
#[derive(Args, Debug, Clone, Default, Serialize, Deserialize, LayeredConfig)]
#[serde(rename_all = "kebab-case")]
#[locket(try_into = "InjectConfig", section = "inject")]
pub struct InjectArgs {
#[arg(long, env = "LOCKET_INJECT_MODE", value_enum)]
#[locket(default = InjectMode::OneShot)]
pub mode: Option<InjectMode>,
#[arg(long, env = "LOCKET_STATUS_FILE")]
#[locket(optional)]
pub status_file: Option<StatusFile>,
#[command(flatten)]
#[serde(flatten)]
pub manager: SecretManagerArgs,
#[arg(long, env = "WATCH_DEBOUNCE")]
#[locket(default = DebounceDuration::default())]
pub debounce: Option<DebounceDuration>,
#[command(flatten)]
#[serde(flatten)]
pub logger: LoggerArgs,
#[command(flatten, next_help_heading = "Provider Configuration")]
#[serde(flatten)]
pub provider: ProviderArgs,
}