Skip to content

fix(types)!: allow initialized state and configuration without loading bounds - #110

Merged
Kilerd merged 1 commit into
mainfrom
fix/runtime-type-bounds
Sep 14, 2026
Merged

Kilerd merged 1 commit into
mainfrom
fix/runtime-type-bounds

Conversation

@Kilerd

@Kilerd Kilerd commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

已经初始化的 state 和配置仍被 builder 的整组方法、ConfigWrapper、GotchaContext 及其消费者要求实现 Default / serde,导致连接池或其他只能显式构造的状态需要提供没有实际意义的默认值。

现在可直接使用 Gotcha::from_state(value) 或 Gotcha::from_context(context)。运行时仅要求 Clone + Send + Sync + 'static;配置没有 serde / Default 也可用于路由、State 提取、消息和任务,并进入 listen / listen_on / run。

let app = Gotcha::from_context(GotchaContext {
    state: initialized_state,
    config: ConfigWrapper {
        server: ServerConfig::default(),
        app: initialized_config,
    },
});
  • ConfigWrapper / GotchaContext 的类型定义不再要求加载能力。serde、Clone、Default 实现只约束对应操作,两个提取宏不再传播无关约束。
  • Builder 用私有初始化表示区分已提供值和延迟初始化。现有默认构造入口保留原有行为,初始化函数在选择该入口时确定;不再把 Default / Deserialize 传播到全部运行时方法。
  • 配置优先级、显式来源错误、默认加载失败后的警告与回退保持不变;监听地址策略也保持现状。
  • context 组装没有异步操作,改为同步函数,避免在 await 期间借用整个 builder,使启用 OpenAPI / task 时启动 future 仍可满足 Send,无需提高回调的 Sync 要求。

兼容说明:with_state::<S>() 等默认入口仍要求 Default,已初始化值使用新入口。GotchaApp::Config 放宽为运行时约束,Deserialize 移到 config() / run() 方法;调用这两个方法的泛型代码需要显式添加 A::Config: DeserializeOwned。这项方法约束也适用于自定义 config() 实现;无需反序列化的配置可以通过 build_router(context) 或 builder 的 from_context 使用。GotchaConfig 保留原有 trait 约束以兼容已有泛型代码,但框架运行时不再依赖它。

验证包括外部消费者的真实 HTTP 提取与 Message 调用、无 Default/serde 的状态配置、各启动入口的 Send future、任务注册、仅 Deserialize 的加载和仅 Serialize 的序列化;既有 builder HTTP 组合测试改用无 Default/serde 的 context,并验证显式配置覆盖文件来源;另有一个测试确保提供 state 后不会调用未使用的 Default。README 和迁移文档已更新。

本地验证通过:cargo test -p gotcha、cargo test -p gotcha --all-features(含 48 个通过的 doctest)、cargo test -p gotcha_macro、workspace all-features Clippy(-D warnings)、格式和 diff 检查。

GitHub CI:11 项检查全部通过,验证提交 ea9ec6b6552e3c1394d6b54a2e6b6bc6725bb522。

Closes #94

@Kilerd
Kilerd merged commit f33811e into main Sep 14, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P2][types] 将 Default 与配置序列化约束下放到实际需要的方法

1 participant