chant/config/
validation.rs1use anyhow::Result;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6use std::fmt;
7
8use super::defaults::{FailureConfig, WatchConfig};
9
10impl WatchConfig {
11 pub fn validate(&self) -> Result<()> {
13 if self.poll_interval_ms == 0 {
14 anyhow::bail!("watch.poll_interval_ms must be greater than 0");
15 }
16
17 self.failure.validate()
18 }
19}
20
21impl FailureConfig {
22 pub fn validate(&self) -> Result<()> {
24 if self.backoff_multiplier < 1.0 {
25 anyhow::bail!(
26 "watch.failure.backoff_multiplier must be >= 1.0, got {}",
27 self.backoff_multiplier
28 );
29 }
30
31 Ok(())
32 }
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize, Serialize)]
37#[serde(rename_all = "lowercase")]
38pub enum RejectionAction {
39 #[default]
41 Manual,
42 Dependency,
44 Group,
46}
47
48impl fmt::Display for RejectionAction {
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 match self {
51 RejectionAction::Manual => write!(f, "manual"),
52 RejectionAction::Dependency => write!(f, "dependency"),
53 RejectionAction::Group => write!(f, "group"),
54 }
55 }
56}
57
58#[derive(Debug, Clone, Deserialize, Default)]
60pub struct ApprovalConfig {
61 #[serde(default)]
63 pub rejection_action: RejectionAction,
64 #[serde(default)]
66 pub require_approval_for_agent_work: bool,
67}
68
69#[derive(Debug, Clone, Deserialize, Default)]
71pub struct OutputValidationConfig {
72 #[serde(default)]
74 pub strict_output_validation: bool,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, Default)]
79pub struct EnterpriseConfig {
80 #[serde(default)]
82 pub derived: HashMap<String, DerivedFieldConfig>,
83 #[serde(default)]
85 pub required: Vec<String>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct DerivedFieldConfig {
91 pub from: DerivationSource,
93 pub pattern: String,
95 #[serde(default)]
97 pub validate: Option<ValidationRule>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102#[serde(rename_all = "snake_case")]
103pub enum DerivationSource {
104 Branch,
106 Path,
108 Env,
110 GitUser,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116#[serde(tag = "type", rename_all = "snake_case")]
117pub enum ValidationRule {
118 Enum {
120 values: Vec<String>,
122 },
123}