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}