mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-11-08 19:22:44 +08:00
builtin() existed to feed the uid-dispatch loop; with a single builtin the vec and match are ceremony. apply_builtin_scripts calls builtin_hy_alpn directly and to_script goes away; tests construct ChainItem literals the way the merge items already did.
63 lines
1.7 KiB
Rust
63 lines
1.7 KiB
Rust
use super::SeqMap;
|
|
use crate::{
|
|
config::PrfItem,
|
|
utils::{dirs, help},
|
|
};
|
|
use serde_yaml_ng::Mapping;
|
|
use smartstring::alias::String;
|
|
use tokio::fs;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct ChainItem {
|
|
pub uid: String,
|
|
pub data: ChainType,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum ChainType {
|
|
Merge(Mapping),
|
|
Script(String),
|
|
Rules(SeqMap),
|
|
Proxies(SeqMap),
|
|
Groups(SeqMap),
|
|
}
|
|
|
|
// Helper trait to allow async conversion
|
|
pub trait AsyncChainItemFrom {
|
|
async fn from_async(item: &PrfItem) -> Option<ChainItem>;
|
|
}
|
|
|
|
impl AsyncChainItemFrom for Option<ChainItem> {
|
|
async fn from_async(item: &PrfItem) -> Self {
|
|
let itype = item.itype.as_ref()?.as_str();
|
|
let file = item.file.clone()?;
|
|
let uid = item.uid.clone().unwrap_or_else(|| "".into());
|
|
let path = dirs::app_profiles_dir().ok()?.join(file.as_str());
|
|
|
|
if !path.exists() {
|
|
return None;
|
|
}
|
|
|
|
match itype {
|
|
"script" => Some(ChainItem {
|
|
uid,
|
|
data: ChainType::Script(fs::read_to_string(path).await.ok()?.into()),
|
|
}),
|
|
"merge" => Some(ChainItem {
|
|
uid,
|
|
data: ChainType::Merge(help::read_mapping(&path).await.ok()?),
|
|
}),
|
|
"rules" | "proxies" | "groups" => {
|
|
let seq_map = help::read_yaml::<SeqMap>(&path).await.ok()?;
|
|
let data = match itype {
|
|
"rules" => ChainType::Rules(seq_map),
|
|
"proxies" => ChainType::Proxies(seq_map),
|
|
_ => ChainType::Groups(seq_map),
|
|
};
|
|
Some(ChainItem { uid, data })
|
|
}
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|