nmd_core/resource/
bucket.rs1use 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}