dap-types 0.0.1

Type definitions for debugger adapter protocol.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
pub struct Request<T> {
    pub seq: u64,
    #[serde(rename = "type")]
    pub type_: RequestTag,
    pub command: String,
    #[serde(default)]
    pub body: T,
}

#[derive(Deserialize, Serialize)]
pub struct Event<T> {
    pub seq: u64,
    #[serde(rename = "type")]
    pub type_: EventTag,
    pub event: String,
    #[serde(default)]
    pub body: T,
}

#[derive(Deserialize, Serialize)]
pub struct Response<T> {
    pub seq: u64,
    #[serde(rename = "type")]
    pub type_: ResponseTag,
    pub request_seq: u64,
    pub success: bool,
    pub command: String,
    #[serde(default)]
    pub body: T,
}

macro_rules! tag {
    (pub struct $name:ident => $impl_name:ident $impl_string:tt $tag:tt;) => {
        #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Deserialize, Serialize)]
        #[serde(from = $impl_string)]
        pub struct $name;

        impl From<$impl_name> for $name {
            fn from(_: $impl_name) -> Self {
                $name
            }
        }

        impl From<$name> for $impl_name {
            fn from(_: $name) -> Self {
                $impl_name::Tag
            }
        }

        #[derive(Deserialize, Serialize)]
        enum $impl_name {
            #[serde(rename = $tag)]
            Tag,
        }
    };
}

tag!(pub struct RequestTag => RequestTagImpl "RequestTagImpl" "request";);
tag!(pub struct ResponseTag => ResponseTagImpl "ResponseTagImpl" "response";);
tag!(pub struct EventTag => EventTagImpl "EventTagImpl" "event";);