Skip to main content

kronos_tide/
config.rs

1use serde::Deserialize;
2use std::fs;
3use std::path::PathBuf;
4
5#[derive(Debug, Deserialize)]
6pub struct KronosConfig {
7    #[serde(default = "default_cols")]
8    pub cols: u16,
9    #[serde(default = "default_rows")]
10    pub rows: u16,
11    #[serde(default = "default_shell")]
12    pub shell: String,
13    #[serde(default = "default_font_size")]
14    pub font_size: f32,
15    #[serde(default = "default_ai_provider")]
16    pub ai_provider: String,
17    #[serde(default = "default_ai_model")]
18    pub ai_model: String,
19    #[serde(default = "default_ai_temp")]
20    pub ai_temperature: f32,
21    #[serde(default = "default_max_panes")]
22    pub max_panes: usize,
23    #[serde(default = "default_scrollback")]
24    pub scrollback_lines: usize,
25    #[serde(default)]
26    pub tide_embedded: bool,
27    #[serde(default)]
28    pub esml_project_root: String,
29}
30
31fn default_cols() -> u16 {
32    120
33}
34fn default_rows() -> u16 {
35    40
36}
37fn default_shell() -> String {
38    std::env::var("SHELL").unwrap_or_else(|_| "/bin/bash".to_string())
39}
40fn default_font_size() -> f32 {
41    14.0
42}
43fn default_ai_provider() -> String {
44    "ollama".to_string()
45}
46fn default_ai_model() -> String {
47    "auto".to_string()
48}
49fn default_ai_temp() -> f32 {
50    0.1
51}
52fn default_max_panes() -> usize {
53    16
54}
55fn default_scrollback() -> usize {
56    10000
57}
58
59impl KronosConfig {
60    pub fn load() -> Self {
61        let config_path = Self::config_path();
62        if let Ok(content) = fs::read_to_string(&config_path) {
63            toml::from_str(&content).unwrap_or_default()
64        } else {
65            Self::default()
66        }
67    }
68
69    fn config_path() -> PathBuf {
70        dirs::config_dir()
71            .unwrap_or_else(|| PathBuf::from("~/.config"))
72            .join("kronos")
73            .join("config.toml")
74    }
75}
76
77impl Default for KronosConfig {
78    fn default() -> Self {
79        Self {
80            cols: default_cols(),
81            rows: default_rows(),
82            shell: default_shell(),
83            font_size: default_font_size(),
84            ai_provider: default_ai_provider(),
85            ai_model: default_ai_model(),
86            ai_temperature: default_ai_temp(),
87            max_panes: default_max_panes(),
88            scrollback_lines: default_scrollback(),
89            tide_embedded: true,
90            esml_project_root: String::new(),
91        }
92    }
93}