systemprompt_models/validators/
web.rs1use 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}