@@ -7,6 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 0.1.397] - 2026-02-26
11+
12+ ### Added
13+
14+ #### Compile-Time Extractor Safety (` rustapi-macros ` )
15+ - ** Body-consuming extractor ordering enforced at compile time** : ` Json<T> ` , ` Body ` , ` ValidatedJson<T> ` must now be the last handler parameter — otherwise you get a clear compiler error instead of a silent runtime failure.
16+ - Descriptive error messages: ` "Body-consuming extractors must be the last parameter" ` .
17+ - Detects multiple body-consuming extractors in the same handler.
18+
19+ #### Typed Error Responses — OpenAPI Integration (` rustapi-macros ` , ` rustapi-core ` )
20+ - New ` #[errors(404 = "Not found", 403 = "Forbidden")] ` attribute macro for route handlers.
21+ - Error types are automatically reflected in the OpenAPI spec with ` ErrorSchema ` references.
22+ - ` Route::error_response() ` builder method for programmatic error response registration.
23+ - Swagger UI now displays all possible error responses per endpoint.
24+
25+ #### Pagination & HATEOAS Helpers (` rustapi-core ` )
26+ - ** ` Paginate ` extractor** : ` ?page=2&per_page=20 ` with sensible defaults (page=1, per_page=20, max=100).
27+ - ** ` Paginated<T> ` response wrapper** : JSON body with ` items ` /` meta ` /` _links ` , RFC 8288 ` Link ` header, ` X-Total-Count ` & ` X-Total-Pages ` headers.
28+ - ** ` CursorPaginate ` extractor** : ` ?cursor=abc&limit=20 ` for cursor-based pagination.
29+ - ** ` CursorPaginated<T> ` response wrapper** : ` items ` + ` next_cursor ` + ` has_more ` .
30+ - Helper methods: ` offset() ` , ` limit() ` , ` paginate() ` , ` after() ` , ` is_first_page() ` .
31+ - All types re-exported in the ` rustapi-rs ` prelude.
32+
33+ #### Built-in Caching Layer (` rustapi-extras ` )
34+ - ** Full rewrite of the caching system** with production-grade features:
35+ - In-memory response cache with LRU eviction and configurable ` max_entries ` (default: 10,000).
36+ - ETag generation via FNV-1a hash + automatic ` If-None-Match ` → 304 Not Modified.
37+ - ` Cache-Control ` header awareness (` no-cache ` , ` no-store ` ).
38+ - ` Vary ` -by-header cache key strategy.
39+ - ` CacheHandle ` for programmatic invalidation (by path prefix, exact key, or clear all).
40+ - ` CacheBuilder ` for ergonomic middleware configuration.
41+
42+ #### Event System & Lifecycle Hooks (` rustapi-core ` )
43+ - ** ` EventBus ` ** : In-process pub/sub with sync and async handlers.
44+ - ` on() ` for sync handlers, ` on_async() ` for async handlers.
45+ - ` emit() ` (fire-and-forget) and ` emit_await() ` (wait for all handlers).
46+ - ` handler_count() ` and ` topics() ` introspection.
47+ - ** Lifecycle hooks** on ` RustApi ` builder:
48+ - ` .on_start(async { ... }) ` — runs before the server starts accepting connections.
49+ - ` .on_shutdown(async { ... }) ` — runs on graceful shutdown.
50+ - Integrated into both ` run() ` and ` run_with_shutdown() ` .
51+ - ` EventBus ` re-exported in the ` rustapi-rs ` prelude.
52+
53+ #### Native Hot Reload / Watch Mode (` cargo-rustapi ` , ` rustapi-core ` )
54+ - ** Complete rewrite of ` cargo rustapi watch ` ** using ` notify ` + ` notify-debouncer-mini ` — no more ` cargo-watch ` dependency.
55+ - 300ms debounce, configurable extension filter, smart ignore paths.
56+ - Build-before-restart: only restarts the server if ` cargo build ` succeeds.
57+ - Graceful process shutdown (kill + 5s timeout), crash detection with "watching for changes" recovery.
58+ - ` .hot_reload(true) ` builder API on ` RustApi ` — prints a dev-mode banner with watcher hints.
59+ - ` cargo rustapi run --watch ` / ` --reload ` / ` --hot ` delegates to the native watcher.
60+
61+ #### gRPC Support Published (` rustapi-grpc ` )
62+ - ** First crates.io release** of ` rustapi-grpc v0.1.397 ` .
63+ - ` run_rustapi_and_grpc() ` for dual HTTP + gRPC server execution.
64+ - Re-exports ` tonic ` and ` prost ` for ergonomic proto service integration.
65+ - ` protocol-grpc ` feature flag in ` rustapi-rs ` .
66+
1067### Changed
1168- ** Facade-first CORE stabilization** :
1269 - ` rustapi-rs ` public surface is now explicitly curated (` core ` , ` protocol ` , ` extras ` , ` prelude ` ).
@@ -17,19 +74,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1774 - Canonical naming is now ` core-* ` , ` protocol-* ` , ` extras-* ` .
1875 - Meta features standardized: ` core ` , ` protocol-all ` , ` extras-all ` , ` full ` .
1976 - Legacy feature names remain as compatibility aliases and are deprecated.
77+ - ** Publish pipeline** : ` rustapi-grpc ` added to ` smart_publish.ps1 ` and ` publish.ps1 ` in correct dependency order.
2078
21- ### Added
79+ ### Fixed
80+ - Clippy lint: ` .map_or(false, ...) ` → ` .is_some_and(...) ` in cache middleware.
81+ - Clippy lint: Nested ` format! ` macros replaced with single ` format! ` in ETag generation.
82+
83+ ### Documentation
84+ - Expanded cookbook: gRPC, SSR, and AI skill recipes.
85+ - Learning path improvements across multiple maintenance runs.
86+ - Fixed SSR recipe and updated recipes index.
87+
88+ ### Added (Governance)
2289- ** Public API governance** :
2390 - Snapshot files under ` api/public/ ` for ` rustapi-rs ` (default + all-features).
24- - New CI workflow ` .github/workflows/public-api.yml ` :
25- - snapshot drift check
26- - PR label gate requiring ` breaking ` or ` feature ` when snapshot changes.
27- - ** Compatibility contract** :
28- - New ` CONTRACT.md ` defining SemVer, MSRV (1.78), deprecation and feature policies.
91+ - CI workflow for snapshot drift check and PR label gate.
92+ - ** Compatibility contract** : New ` CONTRACT.md ` defining SemVer, MSRV (1.78), deprecation and feature policies.
2993
3094### Deprecated
3195- Legacy facade paths and feature aliases are soft-deprecated and scheduled for removal no earlier than two minor releases after announcement.
3296
97+ ## [ 0.1.335] - 2026-02-13
98+
99+ ### Added
100+ - Pagination cookbook recipe and synced docs to v0.1.335.
101+ - HATEOAS test schemas with manual ` RustApiSchema ` implementations.
102+ - RELEASES.md for release tracking.
103+
104+ ### Fixed
105+ - Lint formatting in ` custom_messages.rs ` .
106+ - Pagination size validation (PR review feedback).
107+ - Cumulative CI failure fixes.
108+
33109## [ 0.1.300] - 2026-02-06
34110
35111### Added
@@ -304,7 +380,16 @@ This release delivers a **12x performance improvement**, bringing RustAPI from ~
304380- ` extras ` meta-feature for common optional features
305381- ` full ` feature for all optional features
306382
307- [ Unreleased ] : https://github.com/Tuntii/RustAPI/compare/v0.1.4...HEAD
383+ [ Unreleased ] : https://github.com/Tuntii/RustAPI/compare/v0.1.397...HEAD
384+ [ 0.1.397 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.335...v0.1.397
385+ [ 0.1.335 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.300...v0.1.335
386+ [ 0.1.300 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.202...v0.1.300
387+ [ 0.1.202 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.15...v0.1.202
388+ [ 0.1.15 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.11...v0.1.15
389+ [ 0.1.11 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.10...v0.1.11
390+ [ 0.1.10 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.9...v0.1.10
391+ [ 0.1.9 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.8...v0.1.9
392+ [ 0.1.8 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.4...v0.1.8
308393[ 0.1.4 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.3...v0.1.4
309394[ 0.1.3 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.2...v0.1.3
310395[ 0.1.2 ] : https://github.com/Tuntii/RustAPI/compare/v0.1.1...v0.1.2
0 commit comments