1use crate::{
2 action::{NoOk, NoParams},
3 descriptor::{
4 traits::{DescribeOk, DescribeParams, DescribeValue},
5 types::{
6 FieldDescriptor, NestedObjectDescriptor, OkDescriptor, ParamsDescriptor,
7 PrimitiveDescriptor, ValueDescriptor,
8 },
9 },
10 json_rpc::{
11 JsonRpcError, JsonRpcErrorResponse, JsonRpcId, JsonRpcParams, JsonRpcResponse,
12 JsonRpcSuccessResponse,
13 },
14};
15
16macro_rules! impl_integer_value {
17 ($($ty:ty),* $(,)?) => {
18 $(
19 impl DescribeValue for $ty {
20 fn describe_value() -> ValueDescriptor {
21 ValueDescriptor::Primitive(PrimitiveDescriptor::Integer)
22 }
23 }
24
25 impl DescribeParams for $ty {
26 fn describe_params() -> Option<ParamsDescriptor> {
27 Some(ParamsDescriptor::Value(<Self as DescribeValue>::describe_value()))
28 }
29 }
30
31 impl DescribeOk for $ty {
32 fn describe_ok() -> Option<OkDescriptor> {
33 Some(<Self as DescribeValue>::describe_value())
34 }
35 }
36 )*
37 };
38}
39
40macro_rules! impl_number_value {
41 ($($ty:ty),* $(,)?) => {
42 $(
43 impl DescribeValue for $ty {
44 fn describe_value() -> ValueDescriptor {
45 ValueDescriptor::Primitive(PrimitiveDescriptor::Number)
46 }
47 }
48
49 impl DescribeParams for $ty {
50 fn describe_params() -> Option<ParamsDescriptor> {
51 Some(ParamsDescriptor::Value(<Self as DescribeValue>::describe_value()))
52 }
53 }
54
55 impl DescribeOk for $ty {
56 fn describe_ok() -> Option<OkDescriptor> {
57 Some(<Self as DescribeValue>::describe_value())
58 }
59 }
60 )*
61 };
62}
63
64impl DescribeValue for bool {
65 fn describe_value() -> ValueDescriptor {
66 ValueDescriptor::Primitive(PrimitiveDescriptor::Bool)
67 }
68}
69
70impl DescribeParams for bool {
71 fn describe_params() -> Option<ParamsDescriptor> {
72 Some(ParamsDescriptor::Value(
73 <Self as DescribeValue>::describe_value(),
74 ))
75 }
76}
77
78impl DescribeOk for bool {
79 fn describe_ok() -> Option<OkDescriptor> {
80 Some(<Self as DescribeValue>::describe_value())
81 }
82}
83
84impl DescribeValue for String {
85 fn describe_value() -> ValueDescriptor {
86 ValueDescriptor::Primitive(PrimitiveDescriptor::String)
87 }
88}
89
90impl DescribeParams for String {
91 fn describe_params() -> Option<ParamsDescriptor> {
92 Some(ParamsDescriptor::Value(
93 <Self as DescribeValue>::describe_value(),
94 ))
95 }
96}
97
98impl DescribeOk for String {
99 fn describe_ok() -> Option<OkDescriptor> {
100 Some(<Self as DescribeValue>::describe_value())
101 }
102}
103
104impl DescribeValue for str {
105 fn describe_value() -> ValueDescriptor {
106 ValueDescriptor::Primitive(PrimitiveDescriptor::String)
107 }
108}
109
110impl_integer_value!(
111 u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize
112);
113impl_number_value!(f32, f64);
114
115impl<T> DescribeValue for Vec<T>
116where
117 T: DescribeValue,
118{
119 fn describe_value() -> ValueDescriptor {
120 ValueDescriptor::Array(Box::new(T::describe_value()))
121 }
122}
123
124impl<T> DescribeParams for Vec<T>
125where
126 T: DescribeValue,
127{
128 fn describe_params() -> Option<ParamsDescriptor> {
129 Some(ParamsDescriptor::Value(
130 <Self as DescribeValue>::describe_value(),
131 ))
132 }
133}
134
135impl<T> DescribeOk for Vec<T>
136where
137 T: DescribeValue,
138{
139 fn describe_ok() -> Option<OkDescriptor> {
140 Some(<Self as DescribeValue>::describe_value())
141 }
142}
143
144impl DescribeValue for serde_json::Value {
145 fn describe_value() -> ValueDescriptor {
146 ValueDescriptor::Any
147 }
148}
149
150impl DescribeParams for serde_json::Value {
151 fn describe_params() -> Option<ParamsDescriptor> {
152 Some(ParamsDescriptor::Value(ValueDescriptor::Any))
153 }
154}
155
156impl DescribeOk for serde_json::Value {
157 fn describe_ok() -> Option<OkDescriptor> {
158 Some(ValueDescriptor::Any)
159 }
160}
161
162impl DescribeValue for JsonRpcId {
163 fn describe_value() -> ValueDescriptor {
164 ValueDescriptor::OneOf(vec![
165 ValueDescriptor::Primitive(PrimitiveDescriptor::String),
166 ValueDescriptor::Primitive(PrimitiveDescriptor::Number),
167 ValueDescriptor::Primitive(PrimitiveDescriptor::Null),
168 ])
169 }
170}
171
172impl DescribeParams for JsonRpcId {
173 fn describe_params() -> Option<ParamsDescriptor> {
174 Some(ParamsDescriptor::Value(
175 <Self as DescribeValue>::describe_value(),
176 ))
177 }
178}
179
180impl DescribeOk for JsonRpcId {
181 fn describe_ok() -> Option<OkDescriptor> {
182 Some(<Self as DescribeValue>::describe_value())
183 }
184}
185
186impl DescribeValue for JsonRpcParams {
187 fn describe_value() -> ValueDescriptor {
188 ValueDescriptor::OneOf(vec![
189 ValueDescriptor::Array(Box::new(ValueDescriptor::Any)),
190 ValueDescriptor::Map(Box::new(ValueDescriptor::Any)),
191 ])
192 }
193}
194
195impl DescribeParams for JsonRpcParams {
196 fn describe_params() -> Option<ParamsDescriptor> {
197 Some(ParamsDescriptor::Value(
198 <Self as DescribeValue>::describe_value(),
199 ))
200 }
201}
202
203impl DescribeOk for JsonRpcParams {
204 fn describe_ok() -> Option<OkDescriptor> {
205 Some(<Self as DescribeValue>::describe_value())
206 }
207}
208
209impl DescribeValue for JsonRpcError {
210 fn describe_value() -> ValueDescriptor {
211 ValueDescriptor::Object(NestedObjectDescriptor {
212 fields: vec![
213 FieldDescriptor {
214 name: "code".to_string(),
215 ty: ValueDescriptor::Primitive(PrimitiveDescriptor::Integer),
216 },
217 FieldDescriptor {
218 name: "message".to_string(),
219 ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
220 },
221 FieldDescriptor {
222 name: "data".to_string(),
223 ty: ValueDescriptor::Any,
224 },
225 ],
226 })
227 }
228}
229
230impl DescribeParams for JsonRpcError {
231 fn describe_params() -> Option<ParamsDescriptor> {
232 Some(ParamsDescriptor::Value(
233 <Self as DescribeValue>::describe_value(),
234 ))
235 }
236}
237
238impl DescribeOk for JsonRpcError {
239 fn describe_ok() -> Option<OkDescriptor> {
240 Some(<Self as DescribeValue>::describe_value())
241 }
242}
243
244impl DescribeParams for NoParams {
245 fn describe_params() -> Option<ParamsDescriptor> {
246 None
247 }
248}
249
250impl DescribeOk for NoOk {
251 fn describe_ok() -> Option<OkDescriptor> {
252 None
253 }
254}
255
256impl<T> DescribeValue for std::collections::HashSet<T>
257where
258 T: DescribeValue,
259{
260 fn describe_value() -> ValueDescriptor {
261 ValueDescriptor::Array(Box::new(T::describe_value()))
262 }
263}
264
265impl<T> DescribeParams for std::collections::HashSet<T>
266where
267 T: DescribeValue,
268{
269 fn describe_params() -> Option<ParamsDescriptor> {
270 Some(ParamsDescriptor::Value(
271 <Self as DescribeValue>::describe_value(),
272 ))
273 }
274}
275
276impl<T> DescribeOk for std::collections::HashSet<T>
277where
278 T: DescribeValue,
279{
280 fn describe_ok() -> Option<OkDescriptor> {
281 Some(<Self as DescribeValue>::describe_value())
282 }
283}
284
285impl DescribeValue for JsonRpcSuccessResponse {
286 fn describe_value() -> ValueDescriptor {
287 ValueDescriptor::Object(NestedObjectDescriptor {
288 fields: vec![
289 FieldDescriptor {
290 name: "jsonrpc".to_string(),
291 ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
292 },
293 FieldDescriptor {
294 name: "id".to_string(),
295 ty: <JsonRpcId as DescribeValue>::describe_value(),
296 },
297 FieldDescriptor {
298 name: "result".to_string(),
299 ty: ValueDescriptor::Any,
300 },
301 ],
302 })
303 }
304}
305
306impl DescribeParams for JsonRpcSuccessResponse {
307 fn describe_params() -> Option<ParamsDescriptor> {
308 Some(ParamsDescriptor::Value(
309 <Self as DescribeValue>::describe_value(),
310 ))
311 }
312}
313
314impl DescribeOk for JsonRpcSuccessResponse {
315 fn describe_ok() -> Option<OkDescriptor> {
316 Some(<Self as DescribeValue>::describe_value())
317 }
318}
319
320impl DescribeValue for JsonRpcErrorResponse {
321 fn describe_value() -> ValueDescriptor {
322 ValueDescriptor::Object(NestedObjectDescriptor {
323 fields: vec![
324 FieldDescriptor {
325 name: "jsonrpc".to_string(),
326 ty: ValueDescriptor::Primitive(PrimitiveDescriptor::String),
327 },
328 FieldDescriptor {
329 name: "id".to_string(),
330 ty: <JsonRpcId as DescribeValue>::describe_value(),
331 },
332 FieldDescriptor {
333 name: "error".to_string(),
334 ty: <JsonRpcError as DescribeValue>::describe_value(),
335 },
336 ],
337 })
338 }
339}
340
341impl DescribeParams for JsonRpcErrorResponse {
342 fn describe_params() -> Option<ParamsDescriptor> {
343 Some(ParamsDescriptor::Value(
344 <Self as DescribeValue>::describe_value(),
345 ))
346 }
347}
348
349impl DescribeOk for JsonRpcErrorResponse {
350 fn describe_ok() -> Option<OkDescriptor> {
351 Some(<Self as DescribeValue>::describe_value())
352 }
353}
354
355impl DescribeValue for JsonRpcResponse {
356 fn describe_value() -> ValueDescriptor {
357 ValueDescriptor::OneOf(vec![
358 <JsonRpcSuccessResponse as DescribeValue>::describe_value(),
359 <JsonRpcErrorResponse as DescribeValue>::describe_value(),
360 ])
361 }
362}
363
364impl DescribeParams for JsonRpcResponse {
365 fn describe_params() -> Option<ParamsDescriptor> {
366 Some(ParamsDescriptor::Value(
367 <Self as DescribeValue>::describe_value(),
368 ))
369 }
370}
371
372impl DescribeOk for JsonRpcResponse {
373 fn describe_ok() -> Option<OkDescriptor> {
374 Some(<Self as DescribeValue>::describe_value())
375 }
376}