nagisa 的协议中立域模型:QQ 机器人框架各层共享的事件、消息段、实体、Id、错误、能力、 资源类型。本 crate 只放数据形态和纯函数式便捷方法,无业务逻辑、无 I/O、不依赖 anyhow。
在 workspace 里的位置:适配器(nagisa-onebot / nagisa-milky)把各自协议的 JSON 翻译
进出这些类型,nagisa-core 用它们驱动 Bot 句柄与事件分发,业务插件只接触本 crate 的
类型,永不接触协议结构。
模块地图:
- [
error]:统一Error/Result与 [bail!] 宏; 业务看不到 retcode / HTTP status / 协议结构。 - [
context]:Context扩展 trait(.context()/.with_context()), 把任意Display错误或Option归一到统一Result。 - [
capability]:Protocol与可探测的Capability。 - [
vendor]:OneBot 实现端厂商 [Vendor](按app_name判定,用于动作名 aliasing)。 - [
id]:Uin/Scene/Peer/MessageId。 - [
resource]:媒体资源的发送来源与接收引用。 - [
segment]:统一消息段Segment。 - [
message]:消息体Message(即Vec<Segment>)、查询/变换扩展MessageExt、流式构造器Msg。 - [
entity]:好友 / 群 / 成员 / 文件等实体(取各协议字段并集,缺的为Option)。 - [
event]:统一事件Event(消息 / 通知 / 请求 / 元 / 逃生口)。
关键设计:
- 协议中立:所有类型按语义建模,不带任何 wire 细节;各协议的私有/未知形态有逃生口
(
Segment::Raw/Event::Raw/ 实体的raw字段), 适配器解码时绝不丢弃未知数据,绝不 panic。 - 基于
Display的错误上下文:Context是扩展 trait 而非From<E: Display>——后者与既有#[from]实现相干性冲突,方法式适配是唯一相干安全的形态。 - 收发同一套
Segment/Message:业务用同一组消息段收发,wire 级的入/出差异由适配器 私有承担;Message就是Vec<Segment>,便捷方法挂在MessageExt扩展 trait 上。