-
Notifications
You must be signed in to change notification settings - Fork 212
/
namespaces.rs
39 lines (34 loc) 路 1.22 KB
/
namespaces.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//! Namespaces are used in conjunction with the MultiSchema preview feature.
/// A nonempty set of namespaces.
/// It is assumed that the namespaces are unique.
/// It is often passed around an Option<Namespaces> for when
/// the namespaces cannot be inferred, or when the MultiSchema preview
/// feature is not enabled.
#[derive(Clone, Debug)]
pub struct Namespaces(String, Vec<String>);
impl Namespaces {
/// Ensures the namespaces are unique.
pub fn from_vec(v: &mut Vec<String>) -> Option<Self> {
v.sort();
v.dedup();
v.pop().map(|i| Namespaces(i, v.to_vec()))
}
/// Unwraps the optional namespace list using the provided namespace
/// as a default value.
pub fn to_vec(o: Option<Self>, default_namespace: String) -> Vec<String> {
match o {
Some(Namespaces(s, mut vec)) => {
vec.push(s);
vec
}
None => vec![default_namespace],
}
}
}
impl IntoIterator for Namespaces {
type Item = String;
type IntoIter = std::iter::Chain<std::iter::Once<String>, <Vec<String> as IntoIterator>::IntoIter>;
fn into_iter(self) -> Self::IntoIter {
std::iter::once(self.0).chain(self.1.into_iter())
}
}