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