vika_cli/config/
loader.rs

1use crate::config::model::Config;
2use crate::error::{ConfigError, Result, VikaError};
3use std::path::PathBuf;
4
5const CONFIG_FILE: &str = ".vika.json";
6
7pub fn load_config() -> Result<Config> {
8    let config_path = PathBuf::from(CONFIG_FILE);
9
10    if !config_path.exists() {
11        return Ok(Config::default());
12    }
13
14    let content = std::fs::read_to_string(&config_path)
15        .map_err(|e| VikaError::from(ConfigError::ReadError(e)))?;
16
17    let config: Config =
18        serde_json::from_str(&content).map_err(|e| VikaError::from(ConfigError::ParseError(e)))?;
19
20    Ok(config)
21}
22
23pub fn save_config(config: &Config) -> Result<()> {
24    let config_path = PathBuf::from(CONFIG_FILE);
25
26    // Ensure $schema is set (use default if not present)
27    let mut config_to_save = config.clone();
28    if config_to_save.schema.is_empty() {
29        config_to_save.schema = crate::config::model::default_schema();
30    }
31
32    let content = serde_json::to_string_pretty(&config_to_save)
33        .map_err(|e| VikaError::from(ConfigError::ParseError(e)))?;
34
35    std::fs::write(&config_path, content)
36        .map_err(|e| VikaError::from(ConfigError::ReadError(e)))?;
37
38    Ok(())
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use std::env;
45
46    #[test]
47    fn test_save_and_load_config() {
48        let temp_dir = tempfile::tempdir().unwrap();
49        let original_dir = env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."));
50
51        env::set_current_dir(&temp_dir).unwrap();
52
53        let config = Config::default();
54        save_config(&config).unwrap();
55
56        let loaded = load_config().unwrap();
57        assert_eq!(loaded.root_dir, config.root_dir);
58        assert_eq!(loaded.schemas.output, config.schemas.output);
59
60        env::set_current_dir(original_dir).unwrap();
61    }
62}