omnigraph/crates
Ragnor Comerford 8f558e6ab9
mr-668: named-field path-param structs for nested cluster routes (green)
`Path<String>` deserializes one path-param value positionally.
Single-mode flat routes (`/branches/{branch}`,
`/commits/{commit_id}`) have one capture; multi-mode nested routes
(`/graphs/{graph_id}/branches/{branch}`,
`/graphs/{graph_id}/commits/{commit_id}`) have two — axum 0.8
propagates the outer capture into nested handlers. Same handler,
two different shapes; the multi-mode shape 500s with
"Wrong number of path arguments. Expected 1 but got 2."

Symptomatic fix: change to `Path<(String, String)>` and ignore the
first element. Breaks again the moment we add another nest layer
(e.g. tenant in Cloud mode).

Correct-by-design fix: named-field structs deserialized by name
from axum's path-param map. Each handler picks only the fields it
needs. Stable across single / multi / future-cloud nest depths
because deserialization is by field name, not position.

* New `BranchPath { branch: String }` (file-local to lib.rs)
* New `CommitPath { commit_id: String }`
* `server_branch_delete` extractor → `Path<BranchPath>`
* `server_commit_show` extractor → `Path<CommitPath>`

Closes the "handler path-extractor type is positional and breaks
when route nesting changes" class. Red test from the previous
commit turns green. All 77 server tests pass (single-mode branch
delete + commit show, plus new multi-mode coverage).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 18:18:49 +02:00
..
omnigraph mr-668: split PolicyEngine::load into kind-typed loaders 2026-05-27 13:35:22 +02:00
omnigraph-cli mr-668: split PolicyEngine::load into kind-typed loaders 2026-05-27 13:35:22 +02:00
omnigraph-compiler mr-668: composite e2e tests, race fix, v0.7.0 release (PR 9/10) 2026-05-25 21:32:49 +02:00
omnigraph-policy mr-668: split PolicyEngine::load into kind-typed loaders 2026-05-27 13:35:22 +02:00
omnigraph-server mr-668: named-field path-param structs for nested cluster routes (green) 2026-05-27 18:18:49 +02:00