use std::collections::HashSet;
use crate::{
namespace_map::{NamespaceString, NamespaceStringBorrowed},
site_info::Interwiki,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct InterwikiSet(HashSet<NamespaceString>);
impl InterwikiSet {
pub fn all_and_local_from_iter<I: IntoIterator<Item = Interwiki>>(
iter: I,
) -> (Self, Self) {
let mut all = Self(HashSet::new());
let mut local = Self(HashSet::new());
for interwiki in iter {
let string = NamespaceString(interwiki.prefix);
if interwiki.local_interwiki {
local.0.insert(string.clone());
}
all.0.insert(string);
}
(all, local)
}
pub fn contains(&self, interwiki: &str) -> bool {
self.0
.contains(NamespaceStringBorrowed::from_str(interwiki))
}
}
impl FromIterator<String> for InterwikiSet {
fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
Self(iter.into_iter().map(NamespaceString).collect())
}
}
#[test]
fn lookup_is_case_insensitive() {
let (set, local) = InterwikiSet::all_and_local_from_iter(
["w", "wikt"].into_iter().map(|prefix| Interwiki {
prefix: prefix.into(),
local_interwiki: prefix == "w",
}),
);
assert!(set.contains("w"));
assert!(set.contains("W"));
assert!(set.contains("wikt"));
assert!(set.contains("WIKT"));
assert!(set.contains("WiKt"));
assert!(local.contains("w"));
assert!(!local.contains("wikt"));
}