1use std::slice;
2
3#[derive(Debug)]
4pub enum OneOrMany<T> {
5 One(T),
6 Many(Vec<T>),
7}
8
9impl<T> FromIterator<T> for OneOrMany<T> {
10 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
11 let mut iter = iter.into_iter();
12
13 let first = iter.next().expect("OneOrMany requires at least one element");
14
15 match iter.next() {
16 None => OneOrMany::One(first),
17
18 Some(second) => {
19 let mut v = vec![first, second];
20 v.extend(iter);
21 OneOrMany::Many(v)
22 }
23 }
24 }
25}
26
27impl<'a, T> IntoIterator for &'a OneOrMany<T> {
28 type Item = &'a T;
29 type IntoIter = slice::Iter<'a, T>;
30
31 fn into_iter(self) -> Self::IntoIter {
32 match self {
33 OneOrMany::One(x) => slice::from_ref(x).iter(),
34 OneOrMany::Many(x) => x.into_iter()
35 }
36 }
37}
38
39impl<T> OneOrMany<T> {
40 pub fn from_vec(mut vec: Vec<T>) -> Option<Self> {
41 match vec.len() {
42 x if x > 1 => Some(Self::Many(vec)),
43 1 => Some(Self::One(vec.remove(0))),
44 _ => None,
45 }
46 }
47
48 pub fn from_val(val: T) -> Self {
49 OneOrMany::One(val)
50 }
51
52 pub fn to_first_or_one(self) -> T {
53 match self {
54 OneOrMany::One(x) => x,
55 OneOrMany::Many(mut x) => x.remove(0),
56 }
57 }
58
59 pub fn to_last_or_one(self) -> T {
60 match self {
61 OneOrMany::One(x) => x,
62 OneOrMany::Many(mut x) => x.remove(x.len() - 1),
63 }
64 }
65}