1use crate::expr::ExprKind;
2use serde_derive::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
5#[serde(rename_all = "kebab-case")]
6pub enum IntegralType {
7 U8,
8 U16,
9 U32,
10 U64,
11 I8,
12 I16,
13 I32,
14 I64,
15 Char,
16}
17
18#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
19#[serde(rename_all = "kebab-case")]
20pub enum FloatingPointType {
21 F16,
22 F32,
23 F64,
24}
25
26#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
27#[serde(rename_all = "kebab-case")]
28#[serde(untagged)]
29#[serde(expecting = "expected integral or floating point type")]
30pub enum PrimitiveType {
31 Integral(IntegralType),
32 FloatingPoint(FloatingPointType),
33}
34
35#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
36#[serde(rename_all = "kebab-case")]
37pub struct ContainerAttributes {
38 #[serde(default)]
39 pub packed: bool,
40 #[serde(default)]
41 pub aligned: u64,
42 #[serde(default)]
43 pub comment: Option<String>,
44}
45
46impl Default for ContainerAttributes {
47 fn default() -> Self {
48 Self {
49 packed: false,
50 aligned: 0,
51 comment: None,
52 }
53 }
54}
55
56#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
57#[serde(rename_all = "kebab-case")]
58pub struct EnumVariant {
59 pub name: String,
60 pub tag_value: u64,
61 pub variant_type: TypeKind,
62}
63
64#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
65#[serde(rename_all = "kebab-case")]
66pub struct EnumType {
67 #[serde(flatten)]
68 pub container_attributes: ContainerAttributes,
69 pub tag_ref: ExprKind,
70 pub variants: Vec<EnumVariant>,
71}
72
73#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
74#[serde(rename_all = "kebab-case")]
75pub struct ArrayType {
76 #[serde(flatten)]
77 pub container_attributes: ContainerAttributes,
78 pub size: ExprKind,
79 pub element_type: Box<TypeKind>,
80 #[serde(default)]
83 pub jagged: bool,
84}
85
86#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
87#[serde(rename_all = "kebab-case")]
88pub struct TypeRefType {
89 pub name: String,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub package: Option<String>,
92 pub comment: Option<String>,
93}
94
95#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
96#[serde(rename_all = "kebab-case")]
97pub struct UnionVariant {
98 pub name: String,
99 pub variant_type: TypeKind,
100}
101
102#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
103#[serde(rename_all = "kebab-case")]
104pub struct UnionType {
105 #[serde(flatten)]
106 pub container_attributes: ContainerAttributes,
107 pub variants: Vec<UnionVariant>,
108}
109
110#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
111#[serde(rename_all = "kebab-case")]
112pub struct SizeDiscriminatedVariant {
113 pub name: String,
114 pub expected_size: u64,
115 pub variant_type: TypeKind,
116}
117
118#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
119#[serde(rename_all = "kebab-case")]
120pub struct SizeDiscriminatedUnionType {
121 #[serde(flatten)]
122 pub container_attributes: ContainerAttributes,
123 pub variants: Vec<SizeDiscriminatedVariant>,
124}
125
126#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
127#[serde(rename_all = "kebab-case")]
128pub struct StructField {
129 pub name: String,
130 pub field_type: TypeKind,
131}
132
133#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
134#[serde(rename_all = "kebab-case")]
135pub struct StructType {
136 #[serde(flatten)]
137 pub container_attributes: ContainerAttributes,
138 pub fields: Vec<StructField>,
139}
140
141#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
142#[serde(rename_all = "kebab-case")]
143pub enum TypeKind {
144 Struct(StructType),
145 Union(UnionType),
146 Enum(EnumType),
147 Array(ArrayType),
148 SizeDiscriminatedUnion(SizeDiscriminatedUnionType),
149 Primitive(PrimitiveType),
150 TypeRef(TypeRefType),
151}
152
153#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
154#[serde(rename_all = "kebab-case")]
155pub struct TypeDef {
156 pub name: String,
157 #[serde(with = "serde_yml::with::singleton_map_recursive")]
158 pub kind: TypeKind,
159}