orion-error 0.8.1

Struct Error for Large Project
Documentation
# 0.8 API Contract

更新时间:2026-05-01

本文档固定 `orion-error 0.8.x` 的公开 API 契约。它描述当前承诺的主路径、
分层模块、feature-gated API、稳定快照和协议 JSON 边界。

如果本文档与 `src/`、`tests/`、`examples/` 冲突,以代码和测试为准,并同步修正
本文档。

## 1. Root Exports

crate root 只承诺保留最小主路径入口:

- `StructError`
- `OperationContext`
- `UnifiedReason`
- derive feature 开启时的 derive 宏:
  - `OrionError`
  - `ErrorCode`
  - `ErrorIdentityProvider`

root 不承诺重新暴露 reason trait、protocol type、report type、
interop type 或测试 helper。它们的正式归属在分层模块中。

`ErrorCode` 作为 derive 宏名字和兼容数值码能力存在;面向外部协议、日志、快照和
监控的稳定机器主键是 `ErrorIdentity.code` / `stable_code()`。

## 2. Prelude

`orion_error::prelude::*` 是新业务代码的推荐导入入口,当前承诺包含:

- `StructError`
- `ErrorWith`
- `ConvErr`
- `SourceErr`
- derive feature 开启时的 `OrionError`

`prelude` 只放主传播路径需要的最小集合。协议、report、interop 和测试 helper
应从各自分层模块导入。

## 3. Layered Modules

分层模块是非 root 类型和 trait 的正式归属。

- `runtime`
  运行时传播载体和上下文:`StructError``StructErrorBuilder`  `OperationContext``OperationScope``WithContext``ErrorMetadata`- `runtime::source`
  source 观察模型:`SourceFrame``SourcePayloadKind``SourcePayloadRef`- `conversion`
  主路径转换 trait:`SourceErr``ErrorWith``ConvErr`  `ConvStructError``ToStructError`- `reason`
  reason trait、分类和内置 reason:`DomainReason``ErrorCode`  `ErrorIdentityProvider``ErrorCategory``UnifiedReason``ConfErrReason`- `report`
  人类诊断与 redaction:`DiagnosticReport``RedactPolicy`- `protocol`
  协议/exposure 投影:`DefaultExposurePolicy``ExposurePolicy`  `ExposureDecision``ErrorProtocolSnapshot``Visibility`- `interop`
  标准错误生态互操作:`StdStructRef``OwnedStdStructError`  `OwnedDynStdStructError``raw_source``RawSource``RawStdError`- `cli`
  CLI 输出辅助:`print_error(...)`- `dev::testing`
  测试断言 helper,不属于业务主路径。
- `dev::prelude`
  协议/schema 测试和迁移验证用宽导入,不属于业务主路径。

`bridge::*` 不是 0.8 当前公开分层入口;标准错误生态边界统一称为 `interop`。

## 4. Source Attachment

source 挂载的推荐主路径是:

- `StructError::with_source(...)`
- `StructErrorBuilder::source(...)`

调用者不需要区分 source 是普通 `StdError` 还是下层 `StructError<_>`;路由由 crate
内部完成。

以下 API 保留为维护旧代码、测试 source 分类或调试 auto-routing 的底层入口,
不作为教程和新业务代码的默认推荐:

- `with_std_source(...)`
- `with_struct_source(...)`
- `StructErrorBuilder::source_std(...)`
- `StructErrorBuilder::source_struct(...)`

## 5. Error Flow

当前推荐的错误流转决策:

- 上游是普通错误,第一次进入结构化体系:`source_err(reason, detail)`- 上游是 `StructError<R1>`,当前层只改变 reason 类型:`conv_err()`- 上游是 `StructError<R1>`,当前层建立新的语义边界:统一使用 `source_err(reason, detail)`- 需要挂载 cause 到已有 `StructError``with_source(...)``builder.source(...)`- 需要进入 `std::error::Error` 生态:`as_std()``into_std()`  `into_boxed_std()``into_dyn_std()`
旧 `owe(...)` / `owe_*()` / `err_wrap(...)` / `want(...)` / `with(...)` 不属于
0.8 当前主 API。

## 6. Feature-Gated API

默认 feature:

- `log`
- `derive`

可选 feature:

- `derive`
  开启 root derive 宏 re-export,并启用 `#[derive(OrionError)]` 等宏。
- `log`
  开启 `log` 集成和 `OperationContext` drop 日志路径。
- `tracing`
  开启 `tracing` 集成;同时启用 `log``tracing` 时,drop 日志优先走
  `tracing` 分支。
- `serde`
  开启主要结构的 `Serialize` / `Deserialize` 支持。
- `serde_json`
  开启 stable snapshot 和 protocol JSON projection 方法:
  `to_stable_snapshot_json()``to_http_error_json()``to_cli_error_json()`  `to_log_error_json()``to_rpc_error_json()`- `anyhow`
  开启 `anyhow::Error` 进入 `source_err(...)` 的适配,并支持官方 dyn interop
  wrapper 的结构化 source 恢复。
- `toml`
  开启 `toml::de::Error` / `toml::ser::Error` 进入 `source_err(...)` 的适配。

文档示例如果依赖 feature,应显式说明或用测试门控覆盖。

## 7. Protocol JSON

协议投影主入口:

- `identity_snapshot()`
- `exposure(...)`
- `into_exposure(...)`
- `ErrorProtocolSnapshot::to_http_error_json()`
- `ErrorProtocolSnapshot::to_cli_error_json()`
- `ErrorProtocolSnapshot::to_log_error_json()`
- `ErrorProtocolSnapshot::to_rpc_error_json()`

`ErrorProtocolSnapshot` 的稳定输入由三部分组成:

- `identity`
- `decision`
- embedded `DiagnosticReport`

稳定承诺:

- `identity.code` 是协议、日志、监控、测试断言的稳定机器主键。
- `identity.category` 是稳定分类。
- `ExposureDecision` 的字段名和含义稳定:`http_status``visibility`  `default_hints``retryable`- HTTP / CLI / log / RPC projection 的顶层用途稳定。

不承诺:

- `render_user_debug()` 的文本格式不是机器协议。
- JSON 中用于人工排障的 `summary` / `rendered_detail` 文本不作为精确稳定 schema。
- `source_frames``debug``display``type_name` 等诊断字段可能随实现调整。
- 未在 `docs/protocol-contract.md` 和测试中锁定的内部 helper 字段不作为公共协议。

## 8. Report And Redaction

`DiagnosticReport` 面向人类诊断,不要求 reason 实现 `ErrorIdentityProvider`。

主入口:

- `report()`
- `into_report()`
- `render()`
- `render_redacted(...)`
- `report_redacted(...)`

redaction 适用于 report、protocol projection 和 source frame 诊断视图。机器协议中的
稳定 code/category 不应被当成自然语言 detail 处理。

## 9. Compatibility Policy

0.8 当前策略:

- 保持主路径稳定。
- 保持 observation surface 可用,但不把它们放进 quick start。
- 保持 `dev::*` 面向测试和迁移验证。
- 不恢复 0.6 / 0.7 legacy API 作为 root 或 prelude 主路径。
- archive 文档保留历史语境,不代表当前推荐用法。