walle-core 0.3.0

Onebot Lib in Rust
Documentation
# Event


以下使用 Event 代指符合 OneBot 标准,未反序列化的事件。

## BaseEvent


OneBot 中的事件类型固定为四种,禁止扩展 type

- Meta
- Message
- Notice
- Request 

由于不同 type 之间拥有不少共同字段,而 Rust Trait 只能约定方法而无法约定字段,因此所有的 Event 抽象拥有一个基本 struct `BaseEvent` 持有所有共同字段。

```rust
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]

pub struct BaseEvent<T> {
    pub id: String,
    #[serde(rename = "impl")]
    pub r#impl: String,
    pub platform: String,
    pub self_id: String,
    pub time: i64,
    #[serde(flatten)]
    pub content: T,
}
```

其余字段,均有 content 持有

## EventContent


EventContent 为一个标准的(无扩展的) content 枚举。

```rust
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]

#[serde(tag = "type")]

#[serde(rename_all = "snake_case")]

pub enum EventContent {
    Meta(Meta),
    Message(Message),
    Notice(Notice),
    Request(Request),
}
```

EventContent 使用 type 字段区分不同的类型,因此符合 Onebot 的标准事件可以反序列化为 `BaseEvent<EventContent>` 类型。

> 该类型可以直接使用类型别名(alias): Event
> ```rust
> /// OneBot 12 标准事件
> pub type Event = BaseEvent<EventContent>;
> pub type MessageEvent = BaseEvent<MessageContent>;
> pub type NoticeEvent = BaseEvent<NoticeContent>;
> pub type RequestEvent = BaseEvent<RequestContent>;
> pub type MetaEvent = BaseEvent<MetaContent>;
> ```

当需要扩展事件时(扩展 detail_type ), 请使用 untagged enum 来实现:

```rust
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]

#[serde(untagged)]

pub enum YourExtendedMeta<T> {
    Standard(Meta),
    Extended(T),
}
```

其中 T 为你自己定义的扩展事件。

当然,你也可以自由定义 Content 枚举( 并不建议怎么做 )。