62 lines
1.4 KiB
Rust
62 lines
1.4 KiB
Rust
use log::error;
|
|
use std::collections::BTreeSet as Set;
|
|
|
|
pub struct NameAliases {
|
|
name: String,
|
|
aliases: Set<String>,
|
|
}
|
|
|
|
impl NameAliases {
|
|
pub fn new(name: String) -> Self {
|
|
Self {
|
|
name,
|
|
aliases: Set::new(),
|
|
}
|
|
}
|
|
|
|
pub fn name(&self) -> &str {
|
|
self.name.as_str()
|
|
}
|
|
pub fn aliases(&self) -> impl Iterator<Item = &str> {
|
|
self.aliases.iter().map(|s| s.as_str())
|
|
}
|
|
|
|
pub fn iter(&self) -> impl Iterator<Item = &str> {
|
|
std::iter::once(self.name()).chain(self.aliases())
|
|
}
|
|
|
|
pub fn push(&mut self, alias: String) {
|
|
if self.name == alias {
|
|
return;
|
|
}
|
|
self.aliases.insert(alias);
|
|
}
|
|
}
|
|
|
|
pub fn select_n_by_regex<'t>(
|
|
n: i16,
|
|
regexs: &Vec<String>,
|
|
nas: impl Iterator<Item = &'t NameAliases>,
|
|
) -> Vec<String> {
|
|
// compile regexs
|
|
let regexs: Vec<_> = (regexs.iter())
|
|
.filter_map(|re| {
|
|
regex::Regex::new(re)
|
|
.inspect_err(|e| error!("invalid regex ignored: {re:?}: {e}"))
|
|
.ok()
|
|
})
|
|
.collect();
|
|
|
|
let matching = |name| regexs.iter().any(|re| re.is_match(name));
|
|
|
|
let nas = nas
|
|
.filter(|na| na.iter().any(matching))
|
|
.map(|na| na.name().to_string());
|
|
|
|
if n == -1 {
|
|
nas.collect()
|
|
} else {
|
|
nas.take(n as usize).collect()
|
|
}
|
|
}
|