mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-06 00:43:43 +08:00
54 lines
1.3 KiB
Rust
54 lines
1.3 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use serde_yaml::{Mapping, Sequence, Value};
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
|
pub struct SeqMap {
|
|
prepend: Sequence,
|
|
append: Sequence,
|
|
delete: Sequence,
|
|
}
|
|
|
|
pub fn use_seq(seq_map: SeqMap, config: Mapping, name: &str) -> Mapping {
|
|
let prepend = seq_map.prepend;
|
|
let append = seq_map.append;
|
|
let delete = seq_map.delete;
|
|
|
|
let origin_seq = config.get(&name).map_or(Sequence::default(), |val| {
|
|
val.as_sequence().unwrap().clone()
|
|
});
|
|
let mut seq = origin_seq.clone();
|
|
|
|
for item in prepend {
|
|
seq.insert(0, item);
|
|
}
|
|
|
|
for item in append {
|
|
seq.push(item);
|
|
}
|
|
let mut delete_names = Vec::new();
|
|
for item in delete {
|
|
let item = item.clone();
|
|
if let Some(name) = if item.is_string() {
|
|
Some(item)
|
|
} else {
|
|
item.get("name").map(|y| y.clone())
|
|
} {
|
|
delete_names.push(name.clone());
|
|
}
|
|
}
|
|
seq.retain(|x| {
|
|
if let Some(x_name) = if x.is_string() {
|
|
Some(x)
|
|
} else {
|
|
x.get("name")
|
|
} {
|
|
!delete_names.contains(&x_name)
|
|
} else {
|
|
true
|
|
}
|
|
});
|
|
|
|
let mut config = config.clone();
|
|
config.insert(Value::from(name), Value::from(seq));
|
|
return config;
|
|
}
|