1
1
use serde:: { Deserialize , Serialize } ;
2
+ use postcard_derive:: Schema ;
2
3
3
4
/// A schema type representing a variably encoded integer
4
5
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize , Deserialize ) ]
@@ -25,6 +26,24 @@ pub enum Varint {
25
26
Isize ,
26
27
}
27
28
29
+ impl Schema for Varint {
30
+ const SCHEMA : & ' static NamedType = & NamedType {
31
+ name : "Varint" ,
32
+ ty : & SdmTy :: Enum ( & [
33
+ & NamedVariant { name : "I16" , ty : & SdmTy :: UnitVariant } ,
34
+ & NamedVariant { name : "I32" , ty : & SdmTy :: UnitVariant } ,
35
+ & NamedVariant { name : "I64" , ty : & SdmTy :: UnitVariant } ,
36
+ & NamedVariant { name : "I128" , ty : & SdmTy :: UnitVariant } ,
37
+ & NamedVariant { name : "U16" , ty : & SdmTy :: UnitVariant } ,
38
+ & NamedVariant { name : "U32" , ty : & SdmTy :: UnitVariant } ,
39
+ & NamedVariant { name : "U64" , ty : & SdmTy :: UnitVariant } ,
40
+ & NamedVariant { name : "U128" , ty : & SdmTy :: UnitVariant } ,
41
+ & NamedVariant { name : "Usize" , ty : & SdmTy :: UnitVariant } ,
42
+ & NamedVariant { name : "Isize" , ty : & SdmTy :: UnitVariant } ,
43
+ ] ) ,
44
+ } ;
45
+ }
46
+
28
47
/// Serde Data Model Types (and friends)
29
48
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize ) ]
30
49
pub enum SdmTy {
@@ -103,6 +122,62 @@ pub enum SdmTy {
103
122
Enum ( & ' static [ & ' static NamedVariant ] ) ,
104
123
}
105
124
125
+ impl Schema for SdmTy {
126
+ const SCHEMA : & ' static NamedType = & NamedType {
127
+ name : "SdmTy" ,
128
+ ty : & SdmTy :: Enum ( & [
129
+ & NamedVariant { name : "Bool" , ty : & SdmTy :: UnitVariant } ,
130
+ & NamedVariant { name : "I8" , ty : & SdmTy :: UnitVariant } ,
131
+ & NamedVariant { name : "U8" , ty : & SdmTy :: UnitVariant } ,
132
+ & NamedVariant { name : "Varint" , ty : & SdmTy :: NewtypeVariant (
133
+ NamedType :: SCHEMA
134
+ ) } ,
135
+ & NamedVariant { name : "F32" , ty : & SdmTy :: UnitVariant } ,
136
+ & NamedVariant { name : "F64" , ty : & SdmTy :: UnitVariant } ,
137
+ & NamedVariant { name : "Char" , ty : & SdmTy :: UnitVariant } ,
138
+ & NamedVariant { name : "String" , ty : & SdmTy :: UnitVariant } ,
139
+ & NamedVariant { name : "ByteArray" , ty : & SdmTy :: UnitVariant } ,
140
+ & NamedVariant { name : "Option" , ty : & SdmTy :: NewtypeVariant (
141
+ NamedType :: SCHEMA
142
+ ) } ,
143
+ & NamedVariant { name : "Unit" , ty : & SdmTy :: UnitVariant } ,
144
+ & NamedVariant { name : "UnitStruct" , ty : & SdmTy :: UnitVariant } ,
145
+ & NamedVariant { name : "UnitVariant" , ty : & SdmTy :: UnitVariant } ,
146
+ & NamedVariant { name : "NewtypeStruct" , ty : & SdmTy :: NewtypeVariant (
147
+ NamedType :: SCHEMA
148
+ ) } ,
149
+ & NamedVariant { name : "NewtypeVariant" , ty : & SdmTy :: NewtypeVariant (
150
+ NamedType :: SCHEMA
151
+ ) } ,
152
+ & NamedVariant { name : "Seq" , ty : & SdmTy :: NewtypeVariant (
153
+ NamedType :: SCHEMA
154
+ ) } ,
155
+ & NamedVariant { name : "Tuple" , ty : & SdmTy :: NewtypeVariant (
156
+ <[ NamedType ] >:: SCHEMA ,
157
+ ) } ,
158
+ & NamedVariant { name : "TupleStruct" , ty : & SdmTy :: NewtypeVariant (
159
+ <[ NamedType ] >:: SCHEMA ,
160
+ ) } ,
161
+ & NamedVariant { name : "TupleVariant" , ty : & SdmTy :: NewtypeVariant (
162
+ <[ NamedType ] >:: SCHEMA ,
163
+ ) } ,
164
+ & NamedVariant { name : "Map" , ty : & SdmTy :: StructVariant ( & [
165
+ & NamedValue { name : "key" , ty : NamedType :: SCHEMA } ,
166
+ & NamedValue { name : "val" , ty : NamedType :: SCHEMA } ,
167
+ ] ) } ,
168
+ & NamedVariant { name : "Struct" , ty : & SdmTy :: NewtypeVariant (
169
+ <[ NamedValue ] >:: SCHEMA ,
170
+ ) } ,
171
+ & NamedVariant { name : "StructVariant" , ty : & SdmTy :: NewtypeVariant (
172
+ <[ NamedValue ] >:: SCHEMA ,
173
+ ) } ,
174
+ & NamedVariant { name : "Enum" , ty : & SdmTy :: NewtypeVariant (
175
+ <[ NamedVariant ] >:: SCHEMA ,
176
+ ) } ,
177
+ ] ) ,
178
+ } ;
179
+ }
180
+
106
181
/// A data type with a name - e.g. a field of a Struct
107
182
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize ) ]
108
183
pub struct NamedValue {
@@ -112,6 +187,16 @@ pub struct NamedValue {
112
187
pub ty : & ' static NamedType ,
113
188
}
114
189
190
+ impl Schema for NamedValue {
191
+ const SCHEMA : & ' static NamedType = & NamedType {
192
+ name : "NamedValue" ,
193
+ ty : & SdmTy :: Struct ( & [
194
+ & NamedValue { name : "name" , ty : str:: SCHEMA } ,
195
+ & NamedValue { name : "ty" , ty : NamedType :: SCHEMA } ,
196
+ ] ) ,
197
+ } ;
198
+ }
199
+
115
200
/// A data type - e.g. a custom `struct Foo{ ... }` type
116
201
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize ) ]
117
202
pub struct NamedType {
@@ -121,6 +206,16 @@ pub struct NamedType {
121
206
pub ty : & ' static SdmTy ,
122
207
}
123
208
209
+ impl Schema for NamedType {
210
+ const SCHEMA : & ' static NamedType = & NamedType {
211
+ name : "NamedType" ,
212
+ ty : & SdmTy :: Struct ( & [
213
+ & NamedValue { name : "name" , ty : str:: SCHEMA } ,
214
+ & NamedValue { name : "ty" , ty : SdmTy :: SCHEMA } ,
215
+ ] ) ,
216
+ } ;
217
+ }
218
+
124
219
/// An enum variant with a name, e.g. `T::Bar(...)`
125
220
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize ) ]
126
221
pub struct NamedVariant {
@@ -130,6 +225,15 @@ pub struct NamedVariant {
130
225
pub ty : & ' static SdmTy ,
131
226
}
132
227
228
+ impl Schema for NamedVariant {
229
+ const SCHEMA : & ' static NamedType = & NamedType {
230
+ name : "SdmTy" ,
231
+ ty : & SdmTy :: Struct ( & [
232
+ // TODO stuff should be here
233
+ ] ) ,
234
+ } ;
235
+ }
236
+
133
237
/// A trait that represents a compile time calculated schema
134
238
pub trait Schema {
135
239
/// A recursive data structure that describes the schema of the given
0 commit comments