Skip to main content

systemprompt_files/config/
validator.rs

1use systemprompt_config::ProfileBootstrap;
2use systemprompt_models::AppPaths;
3use systemprompt_traits::validation_report::{
4    ValidationError, ValidationReport, ValidationWarning,
5};
6use systemprompt_traits::{ConfigProvider, DomainConfig, DomainConfigError};
7
8use super::FilesConfig;
9use super::types::FilesConfigYaml;
10
11const MAX_RECOMMENDED_FILE_SIZE: u64 = 2 * 1024 * 1024 * 1024;
12const MIN_VIDEO_FILE_SIZE: u64 = 100 * 1024 * 1024;
13
14#[derive(Debug, Default)]
15pub struct FilesConfigValidator {
16    config: Option<FilesConfigYaml>,
17}
18
19impl FilesConfigValidator {
20    pub fn new() -> Self {
21        Self::default()
22    }
23}
24
25impl DomainConfig for FilesConfigValidator {
26    fn domain_id(&self) -> &'static str {
27        "files"
28    }
29
30    fn priority(&self) -> u32 {
31        10
32    }
33
34    fn load(&mut self, _config: &dyn ConfigProvider) -> Result<(), DomainConfigError> {
35        let profile =
36            ProfileBootstrap::get().map_err(|e| DomainConfigError::LoadError(e.to_string()))?;
37        let paths = AppPaths::from_profile(&profile.paths)
38            .map_err(|e| DomainConfigError::LoadError(e.to_string()))?;
39        let yaml_config = FilesConfig::load_yaml_config(&paths)
40            .map_err(|e| DomainConfigError::LoadError(e.to_string()))?;
41        self.config = Some(yaml_config);
42        Ok(())
43    }
44
45    fn validate(&self) -> Result<ValidationReport, DomainConfigError> {
46        let mut report = ValidationReport::new("files");
47
48        let config = self
49            .config
50            .as_ref()
51            .ok_or_else(|| DomainConfigError::ValidationError("Not loaded".into()))?;
52
53        if !config.url_prefix.starts_with('/') {
54            report.add_error(ValidationError::new(
55                "files.urlPrefix",
56                "URL prefix must start with '/'",
57            ));
58        }
59
60        if config.upload.max_file_size_bytes > MAX_RECOMMENDED_FILE_SIZE {
61            report.add_warning(
62                ValidationWarning::new(
63                    "files.upload.maxFileSizeBytes",
64                    "Max file size > 2GB may cause memory issues",
65                )
66                .with_suggestion("Consider using a smaller max file size for better performance"),
67            );
68        }
69
70        if config.upload.allowed_types.video
71            && config.upload.max_file_size_bytes < MIN_VIDEO_FILE_SIZE
72        {
73            report.add_warning(
74                ValidationWarning::new(
75                    "files.upload.allowedTypes.video",
76                    "Video uploads enabled but max file size < 100MB",
77                )
78                .with_suggestion("Increase maxFileSizeBytes to at least 100MB for video uploads"),
79            );
80        }
81
82        Ok(report)
83    }
84}