Skip to main content

systemprompt_traits/
domain_config.rs

1//! Domain configuration trait for startup validation.
2
3use std::fmt::Debug;
4
5use crate::context::ConfigProvider;
6use crate::validation_report::ValidationReport;
7
8#[derive(Debug, thiserror::Error)]
9#[non_exhaustive]
10pub enum DomainConfigError {
11    #[error("Failed to load config: {0}")]
12    LoadError(String),
13
14    #[error("Config file not found: {0}")]
15    NotFound(String),
16
17    #[error("Failed to parse config: {0}")]
18    ParseError(String),
19
20    #[error("Validation failed: {0}")]
21    ValidationError(String),
22
23    #[error(transparent)]
24    Other(#[from] anyhow::Error),
25}
26
27pub trait DomainConfig: Send + Sync + Debug {
28    fn domain_id(&self) -> &'static str;
29
30    fn load(&mut self, config: &dyn ConfigProvider) -> Result<(), DomainConfigError>;
31
32    fn validate(&self) -> Result<ValidationReport, DomainConfigError>;
33
34    fn dependencies(&self) -> &[&'static str] {
35        &[]
36    }
37
38    fn priority(&self) -> u32 {
39        100
40    }
41}
42
43pub struct DomainConfigRegistry {
44    validators: Vec<Box<dyn DomainConfig>>,
45}
46
47impl DomainConfigRegistry {
48    #[must_use]
49    pub fn new() -> Self {
50        Self {
51            validators: Vec::new(),
52        }
53    }
54
55    pub fn register(&mut self, validator: Box<dyn DomainConfig>) {
56        self.validators.push(validator);
57    }
58
59    pub fn validators_sorted(&self) -> Vec<&dyn DomainConfig> {
60        let mut validators: Vec<_> = self.validators.iter().map(AsRef::as_ref).collect();
61        validators.sort_by_key(|v| v.priority());
62        validators
63    }
64
65    pub fn validators_mut(&mut self) -> impl Iterator<Item = &mut Box<dyn DomainConfig>> {
66        self.validators.sort_by_key(|v| v.priority());
67        self.validators.iter_mut()
68    }
69}
70
71impl Default for DomainConfigRegistry {
72    fn default() -> Self {
73        Self::new()
74    }
75}
76
77impl Debug for DomainConfigRegistry {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        f.debug_struct("DomainConfigRegistry")
80            .field("validator_count", &self.validators.len())
81            .finish()
82    }
83}