minirpc/
request.rs

1//! MINI-RPC Request.
2
3use crate::{Call, Notification};
4
5/// Request.
6#[derive(Debug, PartialEq, Deserialize, Serialize)]
7#[serde(untagged)]
8pub enum Request {
9    /// A batch of requests (payloads).
10    Batch(Vec<Payload>),
11
12    /// A single request (payload).
13    Single(Payload),
14}
15
16/// Request payload.
17#[derive(Debug, PartialEq, Deserialize, Serialize)]
18#[serde(untagged)]
19pub enum Payload {
20    /// Fire a notification.
21    Notification(Notification),
22
23    /// Call a method.
24    Call(Call),
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use crate::{Call, Id, Method, Notification, Params};
31    use serde_json::{self, Value};
32
33    #[test]
34    fn request_deserialization() {
35        // Single Notification.
36        let input = r#"{"method":"test_method","params":[1,2,3]}"#;
37        let expected = Request::Single(Payload::Notification(Notification {
38            method: Method::String("test_method".to_owned()),
39            params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
40        }));
41
42        let result: Request = serde_json::from_str(input).unwrap();
43        assert_eq!(result, expected);
44
45        // Single Call.
46        let input = r#"{"id":1,"method":"test_method","params":[1,2,3]}"#;
47        let expected = Request::Single(Payload::Call(Call {
48            id: Id::Number(1),
49            method: Method::String("test_method".to_owned()),
50            params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
51        }));
52
53        let result: Request = serde_json::from_str(input).unwrap();
54        assert_eq!(result, expected);
55
56        // Batch Notification and Call.
57        let input =
58            r#"[{"method":"test_method","params":[1,2,3]},{"id":1,"method":"test_method","params":[1,2,3]}]"#;
59        let expected = Request::Batch(vec![
60            Payload::Notification(Notification {
61                method: Method::String("test_method".to_owned()),
62                params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
63            }),
64            Payload::Call(Call {
65                id: Id::Number(1),
66                method: Method::String("test_method".to_owned()),
67                params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
68            }),
69        ]);
70
71        let result: Request = serde_json::from_str(input).unwrap();
72        assert_eq!(result, expected);
73    }
74
75    #[test]
76    fn request_serialization() {
77        // Single Notification.
78        let input = Request::Single(Payload::Notification(Notification {
79            method: Method::String("test_method".to_owned()),
80            params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
81        }));
82        let expected = r#"{"method":"test_method","params":[1,2,3]}"#;
83
84        let result = serde_json::to_string(&input).unwrap();
85        assert_eq!(result, expected);
86
87        // Single Call.
88        let input = Request::Single(Payload::Call(Call {
89            id: Id::Number(1),
90            method: Method::String("test_method".to_owned()),
91            params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
92        }));
93        let expected = r#"{"id":1,"method":"test_method","params":[1,2,3]}"#;
94
95        let result = serde_json::to_string(&input).unwrap();
96        assert_eq!(result, expected);
97
98        // Batch Notification and Call.
99        let input = Request::Batch(vec![
100            Payload::Notification(Notification {
101                method: Method::String("test_method".to_owned()),
102                params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
103            }),
104            Payload::Call(Call {
105                id: Id::Number(1),
106                method: Method::String("test_method".to_owned()),
107                params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
108            }),
109        ]);
110        let expected =
111            r#"[{"method":"test_method","params":[1,2,3]},{"id":1,"method":"test_method","params":[1,2,3]}]"#;
112
113        let result = serde_json::to_string(&input).unwrap();
114        assert_eq!(result, expected);
115    }
116}