1use crate::{Call, Notification};
4
5#[derive(Debug, PartialEq, Deserialize, Serialize)]
7#[serde(untagged)]
8pub enum Request {
9 Batch(Vec<Payload>),
11
12 Single(Payload),
14}
15
16#[derive(Debug, PartialEq, Deserialize, Serialize)]
18#[serde(untagged)]
19pub enum Payload {
20 Notification(Notification),
22
23 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 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 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 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 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 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 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}