libsubconverter/settings/external/
yaml_external.rs

1use serde::Deserialize;
2use std::collections::HashMap;
3
4use super::super::ini_bindings::{FromIni, FromIniWithDelimiter};
5use crate::models::ruleset::RulesetConfigs;
6use crate::models::{ProxyGroupConfigs, RegexMatchConfig, RegexMatchConfigs};
7use crate::settings::yaml_deserializer::deserialize_template_args_as_hash_map;
8use crate::{settings::import_items, utils::http::parse_proxy, Settings};
9
10// Default value functions
11fn default_true() -> bool {
12    true
13}
14
15/// Rule bases settings
16#[derive(Debug, Clone, Deserialize, Default)]
17#[serde(default)]
18pub struct RuleBasesSettings {
19    pub clash_rule_base: String,
20    pub surge_rule_base: String,
21    pub surfboard_rule_base: String,
22    pub mellow_rule_base: String,
23    pub quan_rule_base: String,
24    pub quanx_rule_base: String,
25    pub loon_rule_base: String,
26    pub sssub_rule_base: String,
27    pub singbox_rule_base: String,
28}
29
30/// Rule generation options
31#[derive(Debug, Clone, Deserialize, Default)]
32#[serde(default)]
33pub struct RuleGenerationSettings {
34    #[serde(default = "default_true")]
35    pub enable_rule_generator: bool,
36    pub overwrite_original_rules: bool,
37}
38
39/// Emoji settings
40#[derive(Debug, Clone, Deserialize, Default)]
41#[serde(default)]
42pub struct EmojiSettings {
43    pub add_emoji: Option<bool>,
44    pub remove_old_emoji: Option<bool>,
45    pub emoji: Vec<RegexMatchConfig>,
46}
47
48/// Filtering settings
49#[derive(Debug, Clone, Deserialize, Default)]
50#[serde(default)]
51pub struct FilteringSettings {
52    pub include_remarks: Vec<String>,
53    pub exclude_remarks: Vec<String>,
54}
55
56/// Custom settings
57#[derive(Debug, Clone, Deserialize, Default)]
58#[serde(default)]
59pub struct CustomSettings {
60    // Include the custom settings from RuleBasesSettings
61    #[serde(flatten)]
62    pub rule_bases: RuleBasesSettings,
63
64    // Rule generation options
65    #[serde(flatten)]
66    pub rule_generation: RuleGenerationSettings,
67
68    // Emoji settings
69    #[serde(flatten)]
70    pub emoji_settings: EmojiSettings,
71
72    // Filtering settings
73    #[serde(flatten)]
74    pub filtering: FilteringSettings,
75
76    // Emoji and rename rules
77    #[serde(alias = "emoji")]
78    pub emojis: Vec<String>,
79    pub rename_nodes: Vec<String>,
80
81    // Custom rulesets and proxy groups
82    #[serde(alias = "surge_ruleset")]
83    pub rulesets: Vec<String>,
84    #[serde(alias = "custom_proxy_group")]
85    pub proxy_groups: Vec<String>,
86}
87
88/// Main YAML external settings structure
89#[derive(Debug, Clone, Deserialize, Default)]
90#[serde(default)]
91pub struct YamlExternalSettings {
92    pub custom: CustomSettings,
93    #[serde(deserialize_with = "deserialize_template_args_as_hash_map")]
94    pub tpl_args: Option<HashMap<String, String>>,
95
96    // Processed fields
97    #[serde(skip)]
98    pub parsed_custom_proxy_groups: ProxyGroupConfigs,
99    #[serde(skip)]
100    pub parsed_rulesets: RulesetConfigs,
101    #[serde(skip)]
102    pub parsed_rename: Vec<RegexMatchConfig>,
103    #[serde(skip)]
104    pub parsed_emojis: Vec<RegexMatchConfig>,
105}
106
107impl YamlExternalSettings {
108    pub async fn process_imports(&mut self) -> Result<(), Box<dyn std::error::Error>> {
109        let global = Settings::current();
110        let proxy_config = parse_proxy(&global.proxy_config);
111
112        // Process rename nodes
113        import_items(
114            &mut self.custom.rename_nodes,
115            false,
116            &proxy_config,
117            &global.base_path,
118        )
119        .await?;
120        self.parsed_rename =
121            RegexMatchConfigs::from_ini_with_delimiter(&self.custom.rename_nodes, "@");
122
123        // Process emoji rules
124        import_items(
125            &mut self.custom.emojis,
126            false,
127            &proxy_config,
128            &global.base_path,
129        )
130        .await?;
131        self.parsed_emojis = RegexMatchConfigs::from_ini_with_delimiter(&self.custom.emojis, ",");
132
133        // Process imports for rulesets
134        import_items(
135            &mut self.custom.rulesets,
136            global.api_mode,
137            &proxy_config,
138            &global.base_path,
139        )
140        .await?;
141        self.parsed_rulesets = RulesetConfigs::from_ini(&self.custom.rulesets);
142
143        // Process imports for proxy groups
144        import_items(
145            &mut self.custom.proxy_groups,
146            global.api_mode,
147            &proxy_config,
148            &global.base_path,
149        )
150        .await?;
151        self.parsed_custom_proxy_groups = ProxyGroupConfigs::from_ini(&self.custom.proxy_groups);
152
153        Ok(())
154    }
155}