minecraft_command_types/
has_macro.rs

1use nonempty::NonEmpty;
2use std::collections::{BTreeMap, BTreeSet};
3
4pub trait HasMacro {
5    fn has_macro(&self) -> bool;
6    fn has_macro_conflict(&self) -> bool;
7}
8
9#[macro_export]
10macro_rules! impl_has_macro_false {
11    ($($t:ty),*) => {
12        $(
13            impl HasMacro for $t {
14                #[inline(always)]
15                fn has_macro(&self) -> bool { false }
16
17                fn has_macro_conflict(&self) -> bool { false }
18            }
19        )*
20    };
21}
22
23impl_has_macro_false!(
24    bool,
25    i8,
26    i16,
27    i32,
28    i64,
29    String,
30    ordered_float::NotNan<f32>,
31    ordered_float::NotNan<f64>
32);
33
34impl<A: HasMacro, B: HasMacro> HasMacro for (A, B) {
35    fn has_macro(&self) -> bool {
36        self.0.has_macro() || self.1.has_macro()
37    }
38
39    fn has_macro_conflict(&self) -> bool {
40        self.0.has_macro_conflict() || self.1.has_macro_conflict()
41    }
42}
43
44impl<T: HasMacro> HasMacro for Option<T> {
45    fn has_macro(&self) -> bool {
46        self.as_ref().map(|t| t.has_macro()).unwrap_or(false)
47    }
48
49    fn has_macro_conflict(&self) -> bool {
50        self.as_ref()
51            .map(|t| t.has_macro_conflict())
52            .unwrap_or(false)
53    }
54}
55
56impl<T: HasMacro> HasMacro for Vec<T> {
57    fn has_macro(&self) -> bool {
58        self.iter().any(|t| t.has_macro())
59    }
60
61    fn has_macro_conflict(&self) -> bool {
62        self.iter().any(|t| t.has_macro_conflict())
63    }
64}
65
66impl<T: HasMacro> HasMacro for NonEmpty<T> {
67    fn has_macro(&self) -> bool {
68        self.iter().any(|t| t.has_macro())
69    }
70
71    fn has_macro_conflict(&self) -> bool {
72        self.iter().any(|t| t.has_macro_conflict())
73    }
74}
75
76impl<T: HasMacro> HasMacro for Box<T> {
77    fn has_macro(&self) -> bool {
78        self.as_ref().has_macro()
79    }
80
81    fn has_macro_conflict(&self) -> bool {
82        self.as_ref().has_macro_conflict()
83    }
84}
85
86impl<K, V: HasMacro> HasMacro for BTreeMap<K, V> {
87    fn has_macro(&self) -> bool {
88        self.values().any(|t| t.has_macro())
89    }
90
91    fn has_macro_conflict(&self) -> bool {
92        self.values().any(|t| t.has_macro_conflict())
93    }
94}
95
96impl<T: HasMacro> HasMacro for BTreeSet<T> {
97    fn has_macro(&self) -> bool {
98        self.iter().any(|t| t.has_macro())
99    }
100
101    fn has_macro_conflict(&self) -> bool {
102        self.iter().any(|t| t.has_macro_conflict())
103    }
104}