onebot_v11 0.1.4

OneBot v11 with NapCat/llonebot extension
Documentation
use serde::de::Error;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Meta {
    Lifecycle(Lifecycle),
    Heartbeat(Heartbeat),
}

impl Serialize for Meta {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::ser::Serializer,
    {
        match self {
            Meta::Lifecycle(m) => m.serialize(serializer),
            Meta::Heartbeat(m) => m.serialize(serializer),
        }
    }
}
impl<'de> Deserialize<'de> for Meta {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let value = serde_json::Value::deserialize(deserializer)?;
        match value["meta_event_type"].as_str() {
            Some("lifecycle") => serde_json::from_value(value)
                .map(Meta::Lifecycle)
                .map_err(D::Error::custom),
            Some("heartbeat") => serde_json::from_value(value)
                .map(Meta::Heartbeat)
                .map_err(D::Error::custom),
            _ => Err(D::Error::custom("Invalid meta_event_type")),
        }
    }
    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let value = serde_json::Value::deserialize(deserializer)?;
        *place = match value["meta_event_type"].as_str() {
            Some("lifecycle") => serde_json::from_value(value)
                .map(Meta::Lifecycle)
                .map_err(D::Error::custom)?,
            Some("heartbeat") => serde_json::from_value(value)
                .map(Meta::Heartbeat)
                .map_err(D::Error::custom)?,
            _ => return Err(D::Error::custom("Invalid meta_event_type")),
        };
        Ok(())
    }
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Lifecycle {
    pub time: i64,
    pub self_id: i64,
    pub post_type: String,
    pub meta_event_type: String,
    pub sub_type: String,
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Heartbeat {
    pub time: i64,
    pub self_id: i64,
    pub post_type: String,
    pub meta_event_type: String,
    pub status: serde_json::Value,
    pub interval: i64,
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Config {
    pub heartbeat_enable: bool,
    pub heartbeat_interval: i64,
}