use tauri::command; use crate::error::AppError; use crate::models::{MissionScanConfig, PlannerDefaults}; use std::path::PathBuf; fn defaults_dir() -> PathBuf { // Save next to the executable std::env::current_exe() .unwrap_or_else(|_| PathBuf::from(".")) .parent() .unwrap_or_else(|| std::path::Path::new(".")) .to_path_buf() } #[command] pub fn save_default_scan_config(config: MissionScanConfig) -> Result<(), AppError> { let path = defaults_dir().join("scan_defaults.json"); let content = serde_json::to_string_pretty(&config)?; std::fs::write(path, content)?; Ok(()) } #[command] pub fn load_default_scan_config() -> Result { let path = defaults_dir().join("scan_defaults.json"); if path.exists() { let content = std::fs::read_to_string(path)?; let config: MissionScanConfig = serde_json::from_str(&content)?; Ok(config) } else { Ok(MissionScanConfig::default()) } } #[command] pub fn save_default_background(path: String) -> Result<(), AppError> { let file_path = defaults_dir().join("background_default.txt"); std::fs::write(file_path, &path)?; Ok(()) } #[command] pub fn load_default_background() -> Result, AppError> { let file_path = defaults_dir().join("background_default.txt"); if file_path.exists() { let content = std::fs::read_to_string(file_path)?; let trimmed = content.trim().to_string(); if trimmed.is_empty() { Ok(None) } else { Ok(Some(trimmed)) } } else { Ok(None) } } #[command] pub fn save_planner_defaults(config: PlannerDefaults) -> Result<(), AppError> { let path = defaults_dir().join("planner_defaults.json"); let content = serde_json::to_string_pretty(&config)?; std::fs::write(path, content)?; Ok(()) } #[command] pub fn load_planner_defaults() -> Result { let path = defaults_dir().join("planner_defaults.json"); if path.exists() { let content = std::fs::read_to_string(path)?; let config: PlannerDefaults = serde_json::from_str(&content)?; Ok(config) } else { Ok(PlannerDefaults::default()) } }