Skip to main content

chronicle/config/
mod.rs

1pub mod user_config;
2
3use crate::error::chronicle_error::GitSnafu;
4use crate::error::Result;
5use crate::git::GitOps;
6use snafu::ResultExt;
7
8/// Chronicle configuration, assembled from defaults + git config.
9#[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
36/// Load config from git config, merging with defaults.
37pub 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}