nmd_core/resource/
bucket.rs

1use std::ops::Add;
2
3use serde::Serialize;
4
5
6#[derive(Debug, PartialEq, Clone, Default, Serialize)]
7pub enum Bucket<T> {
8    All,
9    List(Vec<T>),
10
11    #[default]
12    None
13}
14
15impl<T: PartialEq> Bucket<T> {
16    pub fn contains(&self, item: &T) -> bool {
17        match self {
18            Self::All => true,
19            Self::List(list) => list.contains(item),
20            Self::None => false,
21        }
22    }
23
24    pub fn insert(mut self, item: T) -> Self {
25        match self {
26            Self::All => Self::All,
27            Self::List(ref mut list) => {
28                list.push(item);
29
30                self
31            },
32            Self::None => Self::List(vec![item]),
33        }
34    }    
35}
36
37impl<T: PartialEq + Clone> Bucket<T> {
38    pub fn extend(mut self, b: &Bucket<T>) -> Self {
39        match b {
40            Self::All => Self::All,
41            Self::List(ref list) => {
42                for item in list {
43                    self = self.insert(item.clone());
44                }
45
46                self
47            }
48            Self::None => self,
49        }
50    }
51}
52
53impl<T: Clone> Add for Bucket<T> {
54    type Output = Self;
55
56    fn add(self, new_modifiers_excluded: Self) -> Self::Output {
57        match new_modifiers_excluded.clone() {
58            Self::All => Self::All,
59            Self::List(mut modifiers_to_add) => {
60                match self {
61                    Self::All => return Self::All,
62                    Self::List(mut modifiers_already_excluded) => {
63                        modifiers_already_excluded.append(&mut modifiers_to_add);
64
65                        return Self::List(modifiers_already_excluded)
66                    },
67                    Self::None => return new_modifiers_excluded.clone(),
68                }
69            },
70            Self::None => return self
71        }
72    }
73}
74
75impl<T> From<T> for Bucket<T> {
76    fn from(value: T) -> Self {
77        Self::List(vec![value])
78    }
79}