facet_core/types/
enum_.rs1use super::Struct;
2
3#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
5#[repr(C)]
6#[non_exhaustive]
7pub struct EnumDef {
8 pub repr: EnumRepr,
10
11 pub variants: &'static [Variant],
13}
14
15impl EnumDef {
16 pub const fn builder() -> EnumDefBuilder {
18 EnumDefBuilder::new()
19 }
20}
21
22pub struct EnumDefBuilder {
24 repr: Option<EnumRepr>,
25 variants: Option<&'static [Variant]>,
26}
27
28impl EnumDefBuilder {
29 #[allow(clippy::new_without_default)]
31 pub const fn new() -> Self {
32 Self {
33 repr: None,
34 variants: None,
35 }
36 }
37
38 pub const fn repr(mut self, repr: EnumRepr) -> Self {
40 self.repr = Some(repr);
41 self
42 }
43
44 pub const fn variants(mut self, variants: &'static [Variant]) -> Self {
46 self.variants = Some(variants);
47 self
48 }
49
50 pub const fn build(self) -> EnumDef {
52 EnumDef {
53 repr: self.repr.unwrap(),
54 variants: self.variants.unwrap(),
55 }
56 }
57}
58
59#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
61#[repr(C)]
62#[non_exhaustive]
63pub struct Variant {
64 pub name: &'static str,
66
67 pub discriminant: i64,
69
70 pub data: Struct,
74
75 pub doc: &'static [&'static str],
77}
78
79impl Variant {
80 pub const fn builder() -> VariantBuilder {
82 VariantBuilder::new()
83 }
84}
85
86pub struct VariantBuilder {
88 name: Option<&'static str>,
89 discriminant: Option<i64>,
90 fields: Option<Struct>,
91 doc: &'static [&'static str],
92}
93
94impl VariantBuilder {
95 #[allow(clippy::new_without_default)]
97 pub const fn new() -> Self {
98 Self {
99 name: None,
100 discriminant: None,
101 fields: None,
102 doc: &[],
103 }
104 }
105
106 pub const fn name(mut self, name: &'static str) -> Self {
108 self.name = Some(name);
109 self
110 }
111
112 pub const fn discriminant(mut self, discriminant: i64) -> Self {
114 self.discriminant = Some(discriminant);
115 self
116 }
117
118 pub const fn fields(mut self, fields: Struct) -> Self {
120 self.fields = Some(fields);
121 self
122 }
123
124 pub const fn doc(mut self, doc: &'static [&'static str]) -> Self {
126 self.doc = doc;
127 self
128 }
129
130 pub const fn build(self) -> Variant {
132 Variant {
133 name: self.name.unwrap(),
134 discriminant: self.discriminant.unwrap(),
135 data: self.fields.unwrap(),
136 doc: self.doc,
137 }
138 }
139}
140
141#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
143#[repr(C)]
144#[non_exhaustive]
145pub enum EnumRepr {
146 U8,
148 U16,
150 U32,
152 U64,
154 USize,
156 I8,
158 I16,
160 I32,
162 I64,
164 ISize,
166}
167
168impl EnumRepr {
169 pub const fn from_discriminant_size<T>() -> Self {
177 match core::mem::size_of::<T>() {
178 1 => EnumRepr::U8,
179 2 => EnumRepr::U16,
180 4 => EnumRepr::U32,
181 8 => EnumRepr::U64,
182 _ => panic!("Invalid enum size"),
183 }
184 }
185}