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}