minecraft_command_types/
has_macro.rs1use 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}