## 问题 `#[api]` 为每个 handler 生成 Lazy<Vec<Box<dyn Fn>>> 参数构造器和 Lazy<Box<dyn Fn>> 响应构造器。生成的闭包均不捕获运行时环境,参数数量也在宏展开时已知。动态分配和延迟初始化层次增加了描述符的复杂度,公开签名还暴露 Lazy/Either 等实现细节。 本项是代码层面的精简机会,尚未进行性能测量,不应声称已有显著性能收益。 ## 代码位置 - [gotcha_macro/src/route.rs:90](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha_macro/src/route.rs#L90) - [gotcha_macro/src/route.rs:123](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha_macro/src/route.rs#L123) - [gotcha/src/openapi/mod.rs:63](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/openapi/mod.rs#L63) - [gotcha/src/openapi/mod.rs:87](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/openapi/mod.rs#L87) ## 调整方向 评估静态参数构造函数切片与响应 fn 指针,或者直接生成单一 operation 构造函数。保留需要捕获状态的用户级 transform;不要将这个优化扩大成无依据的注册机制重写。 ## 验收标准 - [x] 用更简单的表示替代不必要的 Lazy/Box/Vec,或记录必须保留它们的具体约束。 - [x] 带参数、返回值、跳过参数、泛型 DTO 的 operation 输出保持等价。 - [x] 多次生成独立文档及递归 schema 继续正确。 - [x] 评估 Operable/ParamConstructor 公共类型的兼容与迁移。 - [x] 若宣称性能改善,提供对应测量(本 PR 未宣称经测量的性能提升,不适用)。 ## 当前版本复查与建议形状 基于 main `0d30d902d4896db50dc5407a4e2ce736e3fd1777` 复查,以上封装仍存在。`gotcha_macro` 的 UUID 依赖只用于给参数/响应构造器生成随机辅助变量名。 建议将描述符收敛为: ```rust 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 检查](https://github.com/Kilerd/gotcha/actions/runs/34812502867)全部通过。 ## 验证与兼容 - 对同一组合用例在重构前后生成完整 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 只说明结构精简,未宣称经过基准测量的性能提升。
Activity