Skip to main content

systemprompt_models/validators/
web.rs

1//! Web configuration validator.
2
3use super::validation_config_provider::{WebConfigRaw, WebMetadataRaw};
4use super::ValidationConfigProvider;
5use std::path::Path;
6use systemprompt_traits::validation_report::{ValidationError, ValidationReport};
7use systemprompt_traits::{ConfigProvider, DomainConfig, DomainConfigError};
8
9#[derive(Debug, Default)]
10pub struct WebConfigValidator {
11    config: Option<WebConfigRaw>,
12    metadata: Option<WebMetadataRaw>,
13    config_path: Option<String>,
14}
15
16impl WebConfigValidator {
17    pub fn new() -> Self {
18        Self::default()
19    }
20}
21
22impl DomainConfig for WebConfigValidator {
23    fn domain_id(&self) -> &'static str {
24        "web"
25    }
26
27    fn priority(&self) -> u32 {
28        10
29    }
30
31    fn load(&mut self, config: &dyn ConfigProvider) -> Result<(), DomainConfigError> {
32        let provider = config
33            .as_any()
34            .downcast_ref::<ValidationConfigProvider>()
35            .ok_or_else(|| {
36                DomainConfigError::LoadError(
37                    "Expected ValidationConfigProvider with pre-loaded configs".into(),
38                )
39            })?;
40
41        self.config = provider.web_config().cloned();
42        self.metadata = provider.web_metadata().cloned();
43        self.config_path = config.get("web_config_path");
44        Ok(())
45    }
46
47    fn validate(&self) -> Result<ValidationReport, DomainConfigError> {
48        let mut report = ValidationReport::new("web");
49
50        let Some(cfg) = self.config.as_ref() else {
51            return Ok(report);
52        };
53
54        if let Some(ref base_url) = cfg.base_url {
55            if !base_url.starts_with("http://") && !base_url.starts_with("https://") {
56                report.add_error(
57                    ValidationError::new(
58                        "web_config.base_url",
59                        format!("Invalid URL format: {}", base_url),
60                    )
61                    .with_suggestion("URL must start with http:// or https://"),
62                );
63            }
64        }
65
66        if let Some(ref site_name) = cfg.site_name {
67            if site_name.is_empty() {
68                report.add_error(ValidationError::new(
69                    "web_config.site_name",
70                    "Site name cannot be empty",
71                ));
72            }
73        }
74
75        if let Some(ref path) = self.config_path {
76            let parent = Path::new(path).parent();
77            if let Some(dir) = parent {
78                if !dir.exists() {
79                    report.add_error(
80                        ValidationError::new("web_config", "Web config directory does not exist")
81                            .with_path(dir),
82                    );
83                }
84            }
85        }
86
87        Ok(report)
88    }
89}