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