Skip to main content

actrpc_core/descriptor/
value_imps.rs

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}