1pub mod user_config;
2
3use crate::error::chronicle_error::GitSnafu;
4use crate::error::Result;
5use crate::git::GitOps;
6use snafu::ResultExt;
7
8#[derive(Debug, Clone)]
10pub struct ChronicleConfig {
11 pub enabled: bool,
12 pub sync: bool,
13 pub provider: Option<String>,
14 pub model: Option<String>,
15 pub notes_ref: String,
16 pub max_diff_lines: u32,
17 pub skip_trivial: bool,
18 pub trivial_threshold: u32,
19}
20
21impl Default for ChronicleConfig {
22 fn default() -> Self {
23 Self {
24 enabled: true,
25 sync: false,
26 provider: None,
27 model: None,
28 notes_ref: "refs/notes/chronicle".to_string(),
29 max_diff_lines: 2000,
30 skip_trivial: true,
31 trivial_threshold: 3,
32 }
33 }
34}
35
36pub fn load_config(git_ops: &dyn GitOps) -> Result<ChronicleConfig> {
38 let mut config = ChronicleConfig::default();
39
40 if let Some(val) = git_ops.config_get("chronicle.enabled").context(GitSnafu)? {
41 config.enabled = val == "true" || val == "1";
42 }
43
44 if let Some(val) = git_ops.config_get("chronicle.sync").context(GitSnafu)? {
45 config.sync = val == "true" || val == "1";
46 }
47
48 if let Some(val) = git_ops.config_get("chronicle.provider").context(GitSnafu)? {
49 config.provider = Some(val);
50 }
51
52 if let Some(val) = git_ops.config_get("chronicle.model").context(GitSnafu)? {
53 config.model = Some(val);
54 }
55
56 if let Some(val) = git_ops.config_get("chronicle.noteref").context(GitSnafu)? {
57 config.notes_ref = val;
58 }
59
60 if let Some(val) = git_ops
61 .config_get("chronicle.maxdifflines")
62 .context(GitSnafu)?
63 {
64 if let Ok(n) = val.parse::<u32>() {
65 config.max_diff_lines = n;
66 }
67 }
68
69 if let Some(val) = git_ops
70 .config_get("chronicle.skiptrivial")
71 .context(GitSnafu)?
72 {
73 config.skip_trivial = val == "true" || val == "1";
74 }
75
76 if let Some(val) = git_ops
77 .config_get("chronicle.trivialthreshold")
78 .context(GitSnafu)?
79 {
80 if let Ok(n) = val.parse::<u32>() {
81 config.trivial_threshold = n;
82 }
83 }
84
85 Ok(config)
86}