Skip to content

[P3][macro] 精简 Operable 生成中的 Lazy、Vec 和动态闭包封装 #95

Closed

Description

@Kilerd

问题

#[api] 为每个 handler 生成 Lazy<Vec<Box>> 参数构造器和 Lazy<Box> 响应构造器。生成的闭包均不捕获运行时环境,参数数量也在宏展开时已知。动态分配和延迟初始化层次增加了描述符的复杂度,公开签名还暴露 Lazy/Either 等实现细节。
本项是代码层面的精简机会,尚未进行性能测量,不应声称已有显著性能收益。

代码位置

调整方向

评估静态参数构造函数切片与响应 fn 指针,或者直接生成单一 operation 构造函数。保留需要捕获状态的用户级 transform;不要将这个优化扩大成无依据的注册机制重写。

验收标准

  • 用更简单的表示替代不必要的 Lazy/Box/Vec,或记录必须保留它们的具体约束。
  • 带参数、返回值、跳过参数、泛型 DTO 的 operation 输出保持等价。
  • 多次生成独立文档及递归 schema 继续正确。
  • 评估 Operable/ParamConstructor 公共类型的兼容与迁移。
  • 若宣称性能改善,提供对应测量(本 PR 未宣称经测量的性能提升,不适用)。

当前版本复查与建议形状

基于 main 0d30d902d4896db50dc5407a4e2ce736e3fd1777 复查,以上封装仍存在。gotcha_macro 的 UUID 依赖只用于给参数/响应构造器生成随机辅助变量名。

建议将描述符收敛为:

pub type ParamConstructor = fn(String) -> ParamType;
// Operable fields:
pub parameters: &'static [ParamConstructor],
pub responses: fn() -> Responses,

宏直接填入静态构造器,去掉为这些构造器使用的 Lazy、Box、Vec 和 UUID 辅助变量。生成 operation 时可以直接移动已有所有权的参数/request body,避免额外 clone。

#[api] 的使用方式及文档输出应保持一致,包括 skip、泛型 DTO、递归 schema、多次独立生成和显式错误响应。手动构造 Operable 或使用旧 ParamConstructor 的代码需要迁移;用户的有状态 OpenAPI transform 保留。

PR #113 已由用户合入,合入 commit 为 165c9db6cec3efa0d50d75bba0754b11c5d2d4d5;本地验证及 11 项 GitHub CI 检查全部通过。

验证与兼容

  • 对同一组合用例在重构前后生成完整 OpenAPI JSON,逐字节一致;覆盖路径/查询/skip、泛型 DTO、递归 schema、errors/responses 覆盖和 drop_default。
  • 新增一个回归测试对比宏生成与手写静态描述符,并验证不同路径及独立文档生成。沿用已有响应契约、schema 身份、宏编译和 transform 测试。
  • 本地 workspace all-features check、gotcha 默认/all-features 测试、macro all-features/no-default-features 测试、Clippy 和格式检查通过。
  • MIGRATION 和 Operable API 文档补充函数指针迁移。普通 #[api] 用法、ParameterProvider/ParamType、有状态 transform,以及 Lazy/Either 的已有导出保持兼容。
  • 本 PR 只说明结构精简,未宣称经过基准测量的性能提升。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions