systemprompt_files/config/
validator.rs1use 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}