mago_codex/metadata/
flags.rs1use serde::Deserialize;
2use serde::Serialize;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct MetadataFlags(u64);
6
7impl MetadataFlags {
8 pub const ABSTRACT: MetadataFlags = MetadataFlags(1 << 0);
9 pub const FINAL: MetadataFlags = MetadataFlags(1 << 1);
10 pub const READONLY: MetadataFlags = MetadataFlags(1 << 3);
11 pub const DEPRECATED: MetadataFlags = MetadataFlags(1 << 4);
12 pub const ENUM_INTERFACE: MetadataFlags = MetadataFlags(1 << 5);
13 pub const POPULATED: MetadataFlags = MetadataFlags(1 << 6);
14 pub const INTERNAL: MetadataFlags = MetadataFlags(1 << 7);
15 pub const CONSISTENT_CONSTRUCTOR: MetadataFlags = MetadataFlags(1 << 11);
16 pub const CONSISTENT_TEMPLATES: MetadataFlags = MetadataFlags(1 << 12);
17 pub const UNCHECKED: MetadataFlags = MetadataFlags(1 << 13);
18 pub const USER_DEFINED: MetadataFlags = MetadataFlags(1 << 14);
19 pub const BUILTIN: MetadataFlags = MetadataFlags(1 << 15);
20 pub const HAS_YIELD: MetadataFlags = MetadataFlags(1 << 16);
21 pub const MUST_USE: MetadataFlags = MetadataFlags(1 << 17);
22 pub const HAS_THROW: MetadataFlags = MetadataFlags(1 << 18);
23 pub const PURE: MetadataFlags = MetadataFlags(1 << 19);
24 pub const IGNORE_NULLABLE_RETURN: MetadataFlags = MetadataFlags(1 << 20);
25 pub const IGNORE_FALSABLE_RETURN: MetadataFlags = MetadataFlags(1 << 21);
26 pub const INHERITS_DOCS: MetadataFlags = MetadataFlags(1 << 22);
27 pub const NO_NAMED_ARGUMENTS: MetadataFlags = MetadataFlags(1 << 23);
28 pub const BACKED_ENUM_CASE: MetadataFlags = MetadataFlags(1 << 24);
29 pub const UNIT_ENUM_CASE: MetadataFlags = MetadataFlags(1 << 25);
30 pub const BY_REFERENCE: MetadataFlags = MetadataFlags(1 << 26);
31 pub const VARIADIC: MetadataFlags = MetadataFlags(1 << 27);
32 pub const PROMOTED_PROPERTY: MetadataFlags = MetadataFlags(1 << 28);
33 pub const HAS_DEFAULT: MetadataFlags = MetadataFlags(1 << 29);
34 pub const VIRTUAL_PROPERTY: MetadataFlags = MetadataFlags(1 << 30);
35 pub const ASYMMETRIC_PROPERTY: MetadataFlags = MetadataFlags(1 << 31);
36 pub const STATIC: MetadataFlags = MetadataFlags(1 << 32);
37 pub const WRITEONLY: MetadataFlags = MetadataFlags(1 << 33);
38 pub const MAGIC_PROPERTY: MetadataFlags = MetadataFlags(1 << 34);
39 pub const MAGIC_METHOD: MetadataFlags = MetadataFlags(1 << 35);
40 pub const API: MetadataFlags = MetadataFlags(1 << 36);
41 pub const MUTATION_FREE: MetadataFlags = MetadataFlags(1 << 37);
42 pub const EXTERNAL_MUTATION_FREE: MetadataFlags = MetadataFlags(1 << 38);
43 pub const SUSPENDS_FIBER: MetadataFlags = MetadataFlags(1 << 39);
44}
45
46impl MetadataFlags {
47 #[inline]
48 #[must_use]
49 pub const fn empty() -> Self {
50 MetadataFlags(0)
51 }
52
53 #[inline]
54 pub const fn insert(&mut self, other: MetadataFlags) {
55 self.0 |= other.0;
56 }
57
58 #[inline]
59 pub const fn set(&mut self, other: MetadataFlags, value: bool) {
60 if value {
61 self.insert(other);
62 } else {
63 self.0 &= !other.0;
64 }
65 }
66
67 #[inline]
68 pub const fn contains(self, other: MetadataFlags) -> bool {
69 (self.0 & other.0) == other.0
70 }
71
72 #[inline]
73 pub const fn remove(&mut self, other: MetadataFlags) {
74 self.0 &= !other.0;
75 }
76
77 #[inline]
78 pub const fn intersects(self, other: MetadataFlags) -> bool {
79 (self.0 & other.0) != 0
80 }
81
82 #[inline]
83 #[must_use]
84 pub const fn union(&self, other: MetadataFlags) -> MetadataFlags {
85 MetadataFlags(self.0 | other.0)
86 }
87
88 #[inline]
89 #[must_use]
90 pub const fn intersection(&self, other: MetadataFlags) -> MetadataFlags {
91 MetadataFlags(self.0 & other.0)
92 }
93}
94
95impl MetadataFlags {
96 #[inline]
97 #[must_use]
98 pub const fn is_deprecated(self) -> bool {
99 self.contains(Self::DEPRECATED)
100 }
101
102 #[inline]
103 #[must_use]
104 pub const fn is_abstract(self) -> bool {
105 self.contains(Self::ABSTRACT)
106 }
107
108 #[inline]
109 #[must_use]
110 pub const fn is_final(self) -> bool {
111 self.contains(Self::FINAL)
112 }
113
114 #[inline]
115 #[must_use]
116 pub const fn has_yield(self) -> bool {
117 self.contains(Self::HAS_YIELD)
118 }
119
120 #[inline]
121 #[must_use]
122 pub const fn must_use(self) -> bool {
123 self.contains(Self::MUST_USE)
124 }
125
126 #[inline]
127 #[must_use]
128 pub const fn is_pure(self) -> bool {
129 self.contains(Self::PURE)
130 }
131
132 #[inline]
133 #[must_use]
134 pub const fn has_consistent_constructor(self) -> bool {
135 self.contains(Self::CONSISTENT_CONSTRUCTOR)
136 }
137
138 #[inline]
139 #[must_use]
140 pub const fn has_consistent_templates(self) -> bool {
141 self.contains(Self::CONSISTENT_TEMPLATES)
142 }
143
144 #[inline]
145 #[must_use]
146 pub const fn is_user_defined(self) -> bool {
147 self.contains(Self::USER_DEFINED)
148 }
149
150 #[inline]
151 #[must_use]
152 pub const fn is_built_in(self) -> bool {
153 self.contains(Self::BUILTIN)
154 }
155
156 #[inline]
157 #[must_use]
158 pub const fn is_internal(self) -> bool {
159 self.contains(Self::INTERNAL)
160 }
161
162 #[inline]
163 #[must_use]
164 pub const fn is_populated(self) -> bool {
165 self.contains(Self::POPULATED)
166 }
167
168 #[inline]
169 #[must_use]
170 pub const fn is_readonly(self) -> bool {
171 self.contains(Self::READONLY)
172 }
173
174 #[inline]
175 #[must_use]
176 pub const fn is_writeonly(self) -> bool {
177 self.contains(Self::WRITEONLY)
178 }
179
180 #[inline]
181 #[must_use]
182 pub const fn is_enum_interface(self) -> bool {
183 self.contains(Self::ENUM_INTERFACE)
184 }
185
186 #[inline]
187 #[must_use]
188 pub const fn is_unchecked(self) -> bool {
189 self.contains(Self::UNCHECKED)
190 }
191
192 #[inline]
193 #[must_use]
194 pub const fn ignore_nullable_return(self) -> bool {
195 self.contains(Self::IGNORE_NULLABLE_RETURN)
196 }
197
198 #[inline]
199 #[must_use]
200 pub const fn ignore_falsable_return(self) -> bool {
201 self.contains(Self::IGNORE_FALSABLE_RETURN)
202 }
203
204 #[inline]
205 #[must_use]
206 pub const fn inherits_docs(self) -> bool {
207 self.contains(Self::INHERITS_DOCS)
208 }
209
210 #[inline]
211 #[must_use]
212 pub const fn forbids_named_arguments(self) -> bool {
213 self.contains(Self::NO_NAMED_ARGUMENTS)
214 }
215
216 #[inline]
217 #[must_use]
218 pub const fn has_throw(self) -> bool {
219 self.contains(Self::HAS_THROW)
220 }
221
222 #[inline]
223 #[must_use]
224 pub const fn is_backed_enum_case(self) -> bool {
225 self.contains(Self::BACKED_ENUM_CASE)
226 }
227
228 #[inline]
229 #[must_use]
230 pub const fn is_unit_enum_case(self) -> bool {
231 self.contains(Self::UNIT_ENUM_CASE)
232 }
233
234 #[inline]
235 #[must_use]
236 pub const fn is_by_reference(self) -> bool {
237 self.contains(Self::BY_REFERENCE)
238 }
239
240 #[inline]
241 #[must_use]
242 pub const fn is_variadic(self) -> bool {
243 self.contains(Self::VARIADIC)
244 }
245
246 #[inline]
247 #[must_use]
248 pub const fn is_promoted_property(self) -> bool {
249 self.contains(Self::PROMOTED_PROPERTY)
250 }
251
252 #[inline]
253 #[must_use]
254 pub const fn has_default(self) -> bool {
255 self.contains(Self::HAS_DEFAULT)
256 }
257
258 #[inline]
259 #[must_use]
260 pub const fn is_virtual_property(self) -> bool {
261 self.contains(Self::VIRTUAL_PROPERTY)
262 }
263
264 #[inline]
265 #[must_use]
266 pub const fn is_magic_property(self) -> bool {
267 self.contains(Self::MAGIC_PROPERTY)
268 }
269
270 #[inline]
271 #[must_use]
272 pub const fn is_magic_method(self) -> bool {
273 self.contains(Self::MAGIC_METHOD)
274 }
275
276 #[inline]
277 #[must_use]
278 pub const fn is_asymmetric_property(self) -> bool {
279 self.contains(Self::ASYMMETRIC_PROPERTY)
280 }
281
282 #[inline]
283 #[must_use]
284 pub const fn is_static(self) -> bool {
285 self.contains(Self::STATIC)
286 }
287
288 #[inline]
289 #[must_use]
290 pub const fn is_public_api(self) -> bool {
291 self.contains(Self::API)
292 }
293
294 #[inline]
295 #[must_use]
296 pub const fn is_mutation_free(self) -> bool {
297 self.contains(Self::MUTATION_FREE)
298 }
299
300 #[inline]
301 #[must_use]
302 pub const fn is_external_mutation_free(self) -> bool {
303 self.contains(Self::EXTERNAL_MUTATION_FREE)
304 }
305
306 #[inline]
307 #[must_use]
308 pub const fn suspends_fiber(self) -> bool {
309 self.contains(Self::SUSPENDS_FIBER)
310 }
311}
312
313impl std::ops::BitOr for MetadataFlags {
314 type Output = Self;
315
316 #[inline]
317 fn bitor(self, rhs: Self) -> Self::Output {
318 MetadataFlags(self.0 | rhs.0)
319 }
320}
321
322impl std::ops::BitAnd for MetadataFlags {
323 type Output = Self;
324
325 #[inline]
326 fn bitand(self, rhs: Self) -> Self::Output {
327 MetadataFlags(self.0 & rhs.0)
328 }
329}
330
331impl std::ops::BitXor for MetadataFlags {
332 type Output = Self;
333
334 #[inline]
335 fn bitxor(self, rhs: Self) -> Self::Output {
336 MetadataFlags(self.0 ^ rhs.0)
337 }
338}
339
340impl std::ops::Not for MetadataFlags {
341 type Output = Self;
342
343 #[inline]
344 fn not(self) -> Self::Output {
345 MetadataFlags(!self.0)
346 }
347}
348
349impl std::ops::BitOrAssign for MetadataFlags {
350 #[inline]
351 fn bitor_assign(&mut self, rhs: Self) {
352 self.0 |= rhs.0;
353 }
354}
355
356impl std::ops::BitAndAssign for MetadataFlags {
357 #[inline]
358 fn bitand_assign(&mut self, rhs: Self) {
359 self.0 &= rhs.0;
360 }
361}
362
363impl std::ops::BitXorAssign for MetadataFlags {
364 #[inline]
365 fn bitxor_assign(&mut self, rhs: Self) {
366 self.0 ^= rhs.0;
367 }
368}