use std::collections::BTreeMap;
use garde::Validate;
use serde::{Deserialize, Serialize};
use crate::types::Waiver;
#[expect(
clippy::module_name_repetitions,
reason = "ShakrsConfig is the canonical document type, named after the shakrs.json file it models, not after the `config` module."
)]
#[derive(Debug, Clone, Serialize, Deserialize, Validate)]
#[serde(deny_unknown_fields)]
pub struct ShakrsConfig {
#[garde(range(min = 1, max = 1))]
pub version: u32,
#[serde(default)]
#[garde(dive)]
pub policies: PoliciesSection,
#[serde(default)]
#[garde(dive)]
pub waivers: Vec<Waiver>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Validate)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct PoliciesSection {
#[serde(default = "crate::runtime::config::default_true")]
#[garde(skip)]
pub default_enabled: bool,
#[serde(default)]
#[garde(skip)]
pub overrides: BTreeMap<String, PolicyOverride>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PolicyOverride {
Enabled(bool),
Detailed {
enabled: bool,
#[serde(default)]
params: serde_json::Value,
},
}