Skip to main content

abi_types/
types.rs

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    /// When true, allows variable-size elements (jagged array). Each element must be
91    /// self-describing (have a footprint function). Element access becomes O(n).
92    #[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}