devalang_core/config/
settings.rs

1use serde::{Deserialize, Serialize};
2use std::{any::Any, io::Write};
3
4#[derive(Serialize, Deserialize, Default, Debug)]
5pub struct UserSettings {
6    pub session: String,
7    pub telemetry: TelemetrySettings,
8}
9
10#[derive(Serialize, Deserialize, Default, Debug)]
11pub struct TelemetrySettings {
12    pub uuid: String,
13    pub stats: bool,
14    pub level: String,
15    pub enabled: bool,
16}
17
18pub fn get_home_dir() -> std::path::PathBuf {
19    dirs::home_dir().unwrap_or_default()
20}
21
22pub fn get_devalang_homedir() -> std::path::PathBuf {
23    get_home_dir().join(".devalang")
24}
25
26pub fn get_default_user_config() -> UserSettings {
27    UserSettings {
28        session: "".into(),
29        telemetry: TelemetrySettings {
30            uuid: uuid::Uuid::new_v4().to_string(),
31            enabled: true,
32            level: "basic".into(),
33            stats: true,
34        },
35    }
36}
37
38pub fn get_user_config() -> Option<UserSettings> {
39    let config_path = get_devalang_homedir().join("config.json");
40    if config_path.try_exists().is_ok() {
41        let file = std::fs::File::open(config_path).ok()?;
42        let settings = serde_json::from_reader(file).ok()?;
43        Some(settings)
44    } else {
45        None
46    }
47}
48
49pub fn write_user_config_file() {
50    let settings = get_user_config().unwrap_or(get_default_user_config());
51
52    let config_path = get_devalang_homedir().join("config.json");
53    let mut file = std::fs::File::create(config_path).unwrap();
54    let config_json = serde_json::to_string(&settings).unwrap();
55
56    file.write_all(config_json.as_bytes()).unwrap();
57}
58
59pub fn set_user_config_bool(key: &str, value: bool) {
60    let mut settings = get_user_config().unwrap_or_default();
61
62    match key {
63        "telemetry" => {
64            settings.telemetry.enabled = value;
65        }
66        _ => {}
67    }
68
69    let config_path = get_devalang_homedir().join("config.json");
70    let config_json = serde_json::to_string(&settings).unwrap();
71    let mut file = std::fs::File::create(config_path).unwrap();
72
73    file.write_all(config_json.as_bytes()).unwrap();
74}
75
76pub fn set_user_config_string(key: &str, value: String) {
77    let mut settings = get_user_config().unwrap_or_default();
78
79    match key {
80        "session" => {
81            settings.session = value;
82        }
83        _ => {}
84    }
85
86    let config_path = get_devalang_homedir().join("config.json");
87    let config_json = serde_json::to_string(&settings).unwrap();
88    let mut file = std::fs::File::create(config_path).unwrap();
89
90    file.write_all(config_json.as_bytes()).unwrap();
91}