#![doc = include_str!("README.md")]
use serde::{Deserialize, Serialize};
mod message;
pub use message::*;
mod notice;
pub use notice::*;
mod meta;
pub use meta::*;
mod request;
pub use request::*;
use crate::ExtendedMap;
pub type StandardEvent = BaseEvent<EventContent>;
pub type MessageEvent = BaseEvent<MessageContent>;
pub type NoticeEvent = BaseEvent<NoticeContent>;
pub type RequestEvent = BaseEvent<RequestContent>;
pub type MetaEvent = BaseEvent<MetaContent>;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BaseEvent<T> {
pub id: String,
#[serde(rename = "impl")]
pub r#impl: String,
pub platform: String,
pub self_id: String,
pub time: f64,
#[serde(flatten)]
pub content: T,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EventContent {
Meta(MetaContent),
Message(MessageContent),
Notice(NoticeContent),
Request(RequestContent),
}
macro_rules! impl_From {
($from: ty, $name: tt) => {
impl From<$from> for EventContent {
fn from(from: $from) -> Self {
EventContent::$name(from)
}
}
impl TryFrom<EventContent> for $from {
type Error = EventContent;
fn try_from(content: EventContent) -> Result<Self, Self::Error> {
match content {
EventContent::$name(from) => Ok(from),
_ => Err(content),
}
}
}
impl TryFrom<StandardEvent> for BaseEvent<$from> {
type Error = StandardEvent;
fn try_from(event: StandardEvent) -> Result<Self, Self::Error> {
match event.content {
EventContent::$name(from) => Ok(BaseEvent {
id: event.id,
r#impl: event.r#impl,
platform: event.platform,
self_id: event.self_id,
time: event.time,
content: from,
}),
_ => Err(event),
}
}
}
};
}
impl_From!(MetaContent, Meta);
impl_From!(MessageContent, Message);
impl_From!(NoticeContent, Notice);
impl_From!(RequestContent, Request);
impl<T> crate::SelfId for BaseEvent<T> {
fn self_id(&self) -> String {
self.self_id.clone()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DetailEventContent {
pub detail_type: String,
#[serde(flatten)]
pub content: ExtendedMap,
}