use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct GlobalConfig {
#[serde(default = "default_timeout_secs_value")]
pub default_timeout_secs: u64,
#[serde(default)]
pub agent_defaults: AgentDefaults,
#[serde(default)]
pub retry_defaults: RetryDefaults,
#[serde(default)]
pub api_configs: HashMap<String, ApiConfig>,
}
const fn default_timeout_secs_value() -> u64 {
30
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct AgentDefaults {
#[serde(default)]
pub json_errors: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RetryDefaults {
#[serde(default)]
pub max_attempts: u32,
#[serde(default = "default_initial_delay_ms")]
pub initial_delay_ms: u64,
#[serde(default = "default_max_delay_ms")]
pub max_delay_ms: u64,
}
const fn default_initial_delay_ms() -> u64 {
500
}
const fn default_max_delay_ms() -> u64 {
30_000
}
impl Default for RetryDefaults {
fn default() -> Self {
Self {
max_attempts: 0, initial_delay_ms: default_initial_delay_ms(),
max_delay_ms: default_max_delay_ms(),
}
}
}
impl Default for GlobalConfig {
fn default() -> Self {
Self {
default_timeout_secs: 30,
agent_defaults: AgentDefaults::default(),
retry_defaults: RetryDefaults::default(),
api_configs: HashMap::new(),
}
}
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ApiConfig {
pub base_url_override: Option<String>,
#[serde(default)]
pub environment_urls: HashMap<String, String>,
#[serde(default)]
pub strict_mode: bool,
#[serde(default)]
pub secrets: HashMap<String, ApertureSecret>,
#[serde(default)]
pub command_mapping: Option<CommandMapping>,
}
impl ApiConfig {
#[must_use]
pub fn is_empty(&self) -> bool {
self.base_url_override.is_none()
&& self.environment_urls.is_empty()
&& self.secrets.is_empty()
&& self.command_mapping.is_none()
}
}
#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)]
pub struct CommandMapping {
#[serde(default)]
pub groups: HashMap<String, String>,
#[serde(default)]
pub operations: HashMap<String, OperationMapping>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)]
pub struct OperationMapping {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub group: Option<String>,
#[serde(default)]
pub aliases: Vec<String>,
#[serde(default)]
pub hidden: bool,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApertureSecret {
pub source: SecretSource,
pub name: String,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "camelCase")]
pub enum SecretSource {
Env,
}