libsubconverter/settings/external/
yaml_external.rs1use 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
10fn default_true() -> bool {
12 true
13}
14
15#[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#[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#[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#[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#[derive(Debug, Clone, Deserialize, Default)]
58#[serde(default)]
59pub struct CustomSettings {
60 #[serde(flatten)]
62 pub rule_bases: RuleBasesSettings,
63
64 #[serde(flatten)]
66 pub rule_generation: RuleGenerationSettings,
67
68 #[serde(flatten)]
70 pub emoji_settings: EmojiSettings,
71
72 #[serde(flatten)]
74 pub filtering: FilteringSettings,
75
76 #[serde(alias = "emoji")]
78 pub emojis: Vec<String>,
79 pub rename_nodes: Vec<String>,
80
81 #[serde(alias = "surge_ruleset")]
83 pub rulesets: Vec<String>,
84 #[serde(alias = "custom_proxy_group")]
85 pub proxy_groups: Vec<String>,
86}
87
88#[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 #[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 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 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 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 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}