1use serde::{Deserialize, Serialize};
2
3#[derive(Deserialize, Serialize)]
4pub struct Request<T> {
5 pub seq: u64,
6 #[serde(rename = "type")]
7 pub type_: RequestTag,
8 pub command: String,
9 #[serde(default)]
10 pub body: T,
11}
12
13#[derive(Deserialize, Serialize)]
14pub struct Event<T> {
15 pub seq: u64,
16 #[serde(rename = "type")]
17 pub type_: EventTag,
18 pub event: String,
19 #[serde(default)]
20 pub body: T,
21}
22
23#[derive(Deserialize, Serialize)]
24pub struct Response<T> {
25 pub seq: u64,
26 #[serde(rename = "type")]
27 pub type_: ResponseTag,
28 pub request_seq: u64,
29 pub success: bool,
30 pub command: String,
31 #[serde(default)]
32 pub body: T,
33}
34
35macro_rules! tag {
36 (pub struct $name:ident => $impl_name:ident $impl_string:tt $tag:tt;) => {
37 #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Deserialize, Serialize)]
38 #[serde(from = $impl_string)]
39 pub struct $name;
40
41 impl From<$impl_name> for $name {
42 fn from(_: $impl_name) -> Self {
43 $name
44 }
45 }
46
47 impl From<$name> for $impl_name {
48 fn from(_: $name) -> Self {
49 $impl_name::Tag
50 }
51 }
52
53 #[derive(Deserialize, Serialize)]
54 enum $impl_name {
55 #[serde(rename = $tag)]
56 Tag,
57 }
58 };
59}
60
61tag!(pub struct RequestTag => RequestTagImpl "RequestTagImpl" "request";);
62tag!(pub struct ResponseTag => ResponseTagImpl "ResponseTagImpl" "response";);
63tag!(pub struct EventTag => EventTagImpl "EventTagImpl" "event";);