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