dap_types/
messages.rs

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";);