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