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")]
28pub enum ValueFormat {
29 Text,
30 Json,
31 Hex,
32 Base64,
33 Base64url,
34}
35
36#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
37#[serde(rename_all = "kebab-case")]
38#[serde(untagged)]
39#[serde(expecting = "expected integral or floating point type")]
40pub enum PrimitiveType {
41 Integral(IntegralType),
42 FloatingPoint(FloatingPointType),
43}
44
45#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
46#[serde(rename_all = "kebab-case")]
47pub struct ContainerAttributes {
48 #[serde(default)]
49 pub packed: bool,
50 #[serde(default)]
51 pub aligned: u64,
52 #[serde(default)]
53 pub comment: Option<String>,
54}
55
56impl Default for ContainerAttributes {
57 fn default() -> Self {
58 Self {
59 packed: false,
60 aligned: 0,
61 comment: None,
62 }
63 }
64}
65
66#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
67#[serde(rename_all = "kebab-case")]
68pub struct EnumVariant {
69 pub name: String,
70 pub tag_value: u64,
71 pub variant_type: TypeKind,
72}
73
74#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
75#[serde(rename_all = "kebab-case")]
76pub struct EnumType {
77 #[serde(flatten)]
78 pub container_attributes: ContainerAttributes,
79 pub tag_ref: ExprKind,
80 pub variants: Vec<EnumVariant>,
81}
82
83#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
84#[serde(rename_all = "kebab-case")]
85pub struct ArrayType {
86 #[serde(flatten)]
87 pub container_attributes: ContainerAttributes,
88 pub size: ExprKind,
89 pub element_type: Box<TypeKind>,
90 #[serde(default)]
93 pub jagged: bool,
94}
95
96#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
97#[serde(rename_all = "kebab-case")]
98pub struct TypeRefType {
99 pub name: String,
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub package: Option<String>,
102 pub comment: Option<String>,
103}
104
105#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
106#[serde(rename_all = "kebab-case")]
107pub struct UnionVariant {
108 pub name: String,
109 pub variant_type: TypeKind,
110}
111
112#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
113#[serde(rename_all = "kebab-case")]
114pub struct UnionType {
115 #[serde(flatten)]
116 pub container_attributes: ContainerAttributes,
117 pub variants: Vec<UnionVariant>,
118}
119
120#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
121#[serde(rename_all = "kebab-case")]
122pub struct SizeDiscriminatedVariant {
123 pub name: String,
124 pub expected_size: u64,
125 pub variant_type: TypeKind,
126}
127
128#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
129#[serde(rename_all = "kebab-case")]
130pub struct SizeDiscriminatedUnionType {
131 #[serde(flatten)]
132 pub container_attributes: ContainerAttributes,
133 pub variants: Vec<SizeDiscriminatedVariant>,
134}
135
136#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
137#[serde(rename_all = "kebab-case")]
138pub struct StructField {
139 pub name: String,
140 #[serde(default, skip_serializing_if = "Option::is_none")]
141 pub format: Option<ValueFormat>,
142 pub field_type: TypeKind,
143}
144
145#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
146#[serde(rename_all = "kebab-case")]
147pub struct StructType {
148 #[serde(flatten)]
149 pub container_attributes: ContainerAttributes,
150 pub fields: Vec<StructField>,
151}
152
153#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
154#[serde(rename_all = "kebab-case")]
155pub enum TypeKind {
156 Struct(StructType),
157 Union(UnionType),
158 Enum(EnumType),
159 Array(ArrayType),
160 SizeDiscriminatedUnion(SizeDiscriminatedUnionType),
161 Primitive(PrimitiveType),
162 TypeRef(TypeRefType),
163}
164
165#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
166#[serde(rename_all = "kebab-case")]
167pub struct TypeDef {
168 pub name: String,
169 #[serde(default, skip_serializing_if = "Option::is_none")]
170 pub format: Option<ValueFormat>,
171 #[serde(with = "serde_yml::with::singleton_map_recursive")]
172 pub kind: TypeKind,
173}