Skip to main content

toggle/
config.rs

1// Configuration file support for the Toggle CLI
2
3use serde::Deserialize;
4use std::collections::HashMap;
5use std::path::Path;
6
7#[derive(Debug, Deserialize, Default)]
8pub struct ToggleConfig {
9    pub global: Option<GlobalConfig>,
10    pub language: Option<HashMap<String, LanguageConfig>>,
11}
12
13#[derive(Debug, Deserialize, Default)]
14pub struct GlobalConfig {
15    pub default_mode: Option<String>,
16    pub force_state: Option<String>,
17    pub single_line_delimiter: Option<String>,
18    pub multi_line_delimiter_start: Option<String>,
19    pub multi_line_delimiter_end: Option<String>,
20}
21
22#[derive(Debug, Deserialize, Default)]
23pub struct LanguageConfig {
24    pub single_line_delimiter: Option<String>,
25    pub multi_line_delimiter_start: Option<String>,
26    pub multi_line_delimiter_end: Option<String>,
27}
28
29impl ToggleConfig {
30    /// Load a toggle config from a TOML file.
31    pub fn load(path: &Path) -> anyhow::Result<Self> {
32        let content = std::fs::read_to_string(path).map_err(|e| {
33            anyhow::anyhow!("Failed to read config file '{}': {}", path.display(), e)
34        })?;
35        let config: ToggleConfig = toml::from_str(&content).map_err(|e| {
36            anyhow::anyhow!("Failed to parse config file '{}': {}", path.display(), e)
37        })?;
38        Ok(config)
39    }
40
41    /// Get the single-line comment delimiter for a given language name.
42    /// Returns None if no language-specific override is configured.
43    pub fn get_language_delimiter(&self, lang: &str) -> Option<&str> {
44        self.language
45            .as_ref()
46            .and_then(|langs| langs.get(lang))
47            .and_then(|lc| lc.single_line_delimiter.as_deref())
48    }
49
50    /// Get multi-line comment delimiters for a given language name.
51    /// Returns None if no language-specific multi-line override is configured.
52    pub fn get_language_multi_line_delimiters(&self, lang: &str) -> Option<(&str, &str)> {
53        self.language
54            .as_ref()
55            .and_then(|langs| langs.get(lang))
56            .and_then(|lc| {
57                match (
58                    lc.multi_line_delimiter_start.as_deref(),
59                    lc.multi_line_delimiter_end.as_deref(),
60                ) {
61                    (Some(start), Some(end)) => Some((start, end)),
62                    _ => None,
63                }
64            })
65    }
66}