整个栈共用一个错误类型。`ErrorKind`(廉价 `Copy` 判别式)+ 可选的、给人看的信息。`no_std`、零依赖。
每一层——h1、h2、h3、HPACK、TLS、客户端、服务端、gRPC——都会失败。如果每层自己发明一个错误类型,你就会得到 `From` impl 爆炸和每个边界上的"这到底是哪个错误?"猜谜。一个类型 = 一个 match,判别式告诉你类别,哪怕 message 帮不上忙。
刻意粗糙——重点是机器可判,不是精确:
- -----
协议层用 message 细化粗糙的类别(`Error::protocol("invalid chunk size")`),所以你两个都有:能分支的类别 + 能记日志的细节。
```rust
use courierust::courierust_error::{Error, ErrorKind};
let err = Error::protocol("the peer sent a malformed request line");
match err.kind {
}
```