1use std::collections::HashSet;
19
20use crate::{
21 namespace_map::{NamespaceString, NamespaceStringBorrowed},
22 site_info::Interwiki,
23};
24
25#[derive(Clone, Debug, PartialEq, Eq)]
27pub struct InterwikiSet(HashSet<NamespaceString>);
28
29impl InterwikiSet {
30 pub fn all_and_local_from_iter<I: IntoIterator<Item = Interwiki>>(
34 iter: I,
35 ) -> (Self, Self) {
36 let mut all = Self(HashSet::new());
37 let mut local = Self(HashSet::new());
38 for interwiki in iter {
39 let string = NamespaceString(interwiki.prefix);
40 if interwiki.local_interwiki {
41 local.0.insert(string.clone());
42 }
43 all.0.insert(string);
44 }
45 (all, local)
46 }
47
48 pub fn contains(&self, interwiki: &str) -> bool {
50 self.0
51 .contains(NamespaceStringBorrowed::from_str(interwiki))
52 }
53}
54
55impl FromIterator<String> for InterwikiSet {
58 fn from_iter<T: IntoIterator<Item = String>>(iter: T) -> Self {
59 Self(iter.into_iter().map(NamespaceString).collect())
60 }
61}
62
63#[test]
64fn lookup_is_case_insensitive() {
65 let (set, local) = InterwikiSet::all_and_local_from_iter(
66 ["w", "wikt"].into_iter().map(|prefix| Interwiki {
67 prefix: prefix.into(),
68 local_interwiki: prefix == "w",
69 }),
70 );
71 assert!(set.contains("w"));
72 assert!(set.contains("W"));
73 assert!(set.contains("wikt"));
74 assert!(set.contains("WIKT"));
75 assert!(set.contains("WiKt"));
76 assert!(local.contains("w"));
77 assert!(!local.contains("wikt"));
78}