Skip to main content

rgx/config/
settings.rs

1use serde::{Deserialize, Serialize};
2use std::path::PathBuf;
3
4use crate::engine::EngineKind;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Settings {
8    #[serde(default = "default_engine")]
9    pub default_engine: String,
10    #[serde(default)]
11    pub case_insensitive: bool,
12    #[serde(default)]
13    pub multiline: bool,
14    #[serde(default)]
15    pub dotall: bool,
16    #[serde(default = "default_true")]
17    pub unicode: bool,
18    #[serde(default)]
19    pub extended: bool,
20    #[serde(default)]
21    pub show_whitespace: bool,
22    #[serde(default)]
23    pub rounded_borders: bool,
24    #[serde(default)]
25    pub vim_mode: bool,
26    #[serde(default = "default_debug_max_steps")]
27    pub debug_max_steps: usize,
28}
29
30fn default_engine() -> String {
31    "rust".to_string()
32}
33
34fn default_true() -> bool {
35    true
36}
37
38fn default_debug_max_steps() -> usize {
39    10_000
40}
41
42impl Default for Settings {
43    fn default() -> Self {
44        Self {
45            default_engine: default_engine(),
46            case_insensitive: false,
47            multiline: false,
48            dotall: false,
49            unicode: default_true(),
50            extended: false,
51            show_whitespace: false,
52            rounded_borders: false,
53            vim_mode: false,
54            debug_max_steps: default_debug_max_steps(),
55        }
56    }
57}
58
59impl Settings {
60    pub fn load() -> Self {
61        let path = config_path();
62        if let Some(path) = path {
63            if path.exists() {
64                if let Ok(content) = std::fs::read_to_string(&path) {
65                    if let Ok(settings) = toml::from_str(&content) {
66                        return settings;
67                    }
68                }
69            }
70        }
71        Self::default()
72    }
73
74    pub fn parse_engine(&self) -> EngineKind {
75        match self.default_engine.as_str() {
76            "fancy" => EngineKind::FancyRegex,
77            #[cfg(feature = "pcre2-engine")]
78            "pcre2" => EngineKind::Pcre2,
79            _ => EngineKind::RustRegex,
80        }
81    }
82}
83
84fn config_path() -> Option<PathBuf> {
85    dirs::config_dir().map(|d| d.join("rgx").join("config.toml"))
86}