onebot_v11 0.1.0

OneBot v11 with NapCat/llonebot extension
Documentation
use crate::api::resp::ApiRespBuilder;

use self::{message::Message, meta::Meta, notice::Notice, request::Request};
use serde::de::Error;
use serde::{Deserialize, Serialize};
use serde_json::Value;

pub mod message;
pub mod meta;
pub mod notice;
pub mod request;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Event {
    Message(Message),
    Meta(Meta),
    Notice(Notice),
    Request(Request),
    ApiRespBuilder(ApiRespBuilder),
}
impl Serialize for Event {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::ser::Serializer,
    {
        match self {
            Event::Message(m) => m.serialize(serializer),
            Event::Meta(m) => m.serialize(serializer),
            Event::Notice(m) => m.serialize(serializer),
            Event::Request(m) => m.serialize(serializer),
            Event::ApiRespBuilder(m) => m.serialize(serializer),
        }
    }
}

impl<'de> Deserialize<'de> for Event {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let value = Value::deserialize(deserializer)?;
        if value["post_type"].as_null().is_some() {
            return serde_json::from_value(value)
                .map(Event::ApiRespBuilder)
                .map_err(D::Error::custom);
        }
        match value["post_type"].as_str() {
            Some("message") => serde_json::from_value(value)
                .map(Event::Message)
                .map_err(D::Error::custom),
            Some("meta_event") => serde_json::from_value(value)
                .map(Event::Meta)
                .map_err(D::Error::custom),
            Some("notice") => serde_json::from_value(value)
                .map(Event::Notice)
                .map_err(D::Error::custom),
            Some("request") => serde_json::from_value(value)
                .map(Event::Request)
                .map_err(D::Error::custom),
            _ => Err(D::Error::custom("Invalid post_type")),
        }
    }
    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let value = Value::deserialize(deserializer)?;
        if value["post_type"].as_null().is_some() {
            *place = serde_json::from_value(value)
                .map(Event::ApiRespBuilder)
                .map_err(D::Error::custom)?;
            return Ok(());
        }
        *place = match value["post_type"].as_str() {
            Some("message") => serde_json::from_value(value)
                .map(Event::Message)
                .map_err(D::Error::custom)?,
            Some("meta_event") => serde_json::from_value(value)
                .map(Event::Meta)
                .map_err(D::Error::custom)?,
            Some("notice") => serde_json::from_value(value)
                .map(Event::Notice)
                .map_err(D::Error::custom)?,
            Some("request") => serde_json::from_value(value)
                .map(Event::Request)
                .map_err(D::Error::custom)?,
            _ => return Err(D::Error::custom("Invalid post_type")),
        };
        Ok(())
    }
}