difflore_core/domain/
settings.rs1use crate::errors::CoreError;
2use crate::models::AppSettingsRecord;
3
4pub async fn get() -> crate::Result<AppSettingsRecord> {
5 let path = crate::paths::data_home()
6 .map_err(CoreError::Internal)?
7 .join("settings.json");
8 if !path.exists() {
9 let defaults = AppSettingsRecord::default();
10 let json = serde_json::to_string_pretty(&defaults)?;
11 std::fs::write(&path, json)?;
12 return Ok(defaults);
13 }
14 let content = std::fs::read_to_string(&path)?;
15 let settings: AppSettingsRecord = serde_json::from_str(&content).map_err(|e| {
19 CoreError::Internal(format!(
20 "settings.json is corrupted and could not be parsed: {e}"
21 ))
22 })?;
23 Ok(settings)
24}
25
26pub async fn update(input: AppSettingsRecord) -> crate::Result<AppSettingsRecord> {
27 let dir = crate::paths::data_home().map_err(CoreError::Internal)?;
28 std::fs::create_dir_all(&dir)?;
29 let path = dir.join("settings.json");
30
31 let mut current: serde_json::Value = if path.exists() {
32 let content = std::fs::read_to_string(&path)?;
33 serde_json::from_str(&content).unwrap_or_else(|_| serde_json::json!({}))
34 } else {
35 serde_json::json!({})
36 };
37
38 let patch: serde_json::Value = serde_json::to_value(&input)?;
39
40 if let (Some(base), Some(overlay)) = (current.as_object_mut(), patch.as_object()) {
41 for (k, v) in overlay {
42 base.insert(k.clone(), v.clone());
43 }
44 }
45
46 let merged: AppSettingsRecord = serde_json::from_value(current.clone())
47 .map_err(|e| CoreError::Internal(format!("Failed to merge settings: {e}")))?;
48
49 let json = serde_json::to_string_pretty(&merged)?;
50 std::fs::write(&path, json)?;
51 Ok(merged)
52}