1use 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 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 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 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}