aperture_cli/config/
models.rs1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
5pub struct GlobalConfig {
6 #[serde(default = "default_timeout_secs_value")]
7 pub default_timeout_secs: u64,
8 #[serde(default)]
9 pub agent_defaults: AgentDefaults,
10 #[serde(default)]
12 pub retry_defaults: RetryDefaults,
13 #[serde(default)]
15 pub api_configs: HashMap<String, ApiConfig>,
16}
17
18const fn default_timeout_secs_value() -> u64 {
19 30
20}
21
22#[derive(Debug, Clone, Deserialize, Serialize, Default)]
23pub struct AgentDefaults {
24 #[serde(default)]
25 pub json_errors: bool,
26}
27
28#[derive(Debug, Clone, Deserialize, Serialize)]
36pub struct RetryDefaults {
37 #[serde(default)]
39 pub max_attempts: u32,
40 #[serde(default = "default_initial_delay_ms")]
42 pub initial_delay_ms: u64,
43 #[serde(default = "default_max_delay_ms")]
45 pub max_delay_ms: u64,
46}
47
48const fn default_initial_delay_ms() -> u64 {
49 500
50}
51
52const fn default_max_delay_ms() -> u64 {
53 30_000
54}
55
56impl Default for RetryDefaults {
57 fn default() -> Self {
58 Self {
59 max_attempts: 0, initial_delay_ms: default_initial_delay_ms(),
61 max_delay_ms: default_max_delay_ms(),
62 }
63 }
64}
65
66impl Default for GlobalConfig {
67 fn default() -> Self {
68 Self {
69 default_timeout_secs: 30,
70 agent_defaults: AgentDefaults::default(),
71 retry_defaults: RetryDefaults::default(),
72 api_configs: HashMap::new(),
73 }
74 }
75}
76
77#[derive(Debug, Deserialize, Serialize, Clone)]
79pub struct ApiConfig {
80 pub base_url_override: Option<String>,
82 #[serde(default)]
84 pub environment_urls: HashMap<String, String>,
85 #[serde(default)]
87 pub strict_mode: bool,
88 #[serde(default)]
90 pub secrets: HashMap<String, ApertureSecret>,
91 #[serde(default)]
93 pub command_mapping: Option<CommandMapping>,
94}
95
96impl ApiConfig {
97 #[must_use]
103 pub fn is_empty(&self) -> bool {
104 self.base_url_override.is_none()
105 && self.environment_urls.is_empty()
106 && self.secrets.is_empty()
107 && self.command_mapping.is_none()
108 }
109}
110
111#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)]
119pub struct CommandMapping {
120 #[serde(default)]
124 pub groups: HashMap<String, String>,
125 #[serde(default)]
127 pub operations: HashMap<String, OperationMapping>,
128}
129
130#[derive(Debug, Deserialize, Serialize, Clone, Default, PartialEq, Eq)]
132pub struct OperationMapping {
133 #[serde(default)]
135 pub name: Option<String>,
136 #[serde(default)]
138 pub group: Option<String>,
139 #[serde(default)]
141 pub aliases: Vec<String>,
142 #[serde(default)]
144 pub hidden: bool,
145}
146
147#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
148#[serde(rename_all = "camelCase")]
149pub struct ApertureSecret {
150 pub source: SecretSource,
151 pub name: String,
152}
153
154#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
155#[serde(rename_all = "camelCase")]
156pub enum SecretSource {
157 Env,
158 }