0.77 — Alike HTTP outcomes, wider OpenAPI import, and branches an earlier refusal hides
· 3 min read
0.77 — Alike HTTP outcomes, wider OpenAPI import, and branches an earlier refusal hides | ESS0.77.0 lets an HTTP route answer two outcomes alike, imports open objects from OpenAPI, keeps declared field order in generated types on request, and refuses a branch an earlier refusal always answers first.ESSfield-noteessfield-noteadopterdevelopertry-spec-driven-developmentresearch
0.77.0 is a feature release with no new source format: every model keeps its meaning, its IR bytes and its compiled digest. The changelog lists every change since 0.70.0; this note covers 0.77.0 and the releases since the last note.
HTTP bindings
- A route may declare
alike:groups of outcomes whose answers are equal, so two outcomes share a status and a body instead of being refused as indistinguishable; OpenAPI writes one response naming every member (#652). - An outcome may answer a
Stringfield astext/plainwithencoding: text. A route may declare its ownrefusals:, a literal or empty body forempty, andbody: arrayfor a view that is not paged (#673).
Import and generated types
- OpenAPI import admits open objects, the empty and
trueschemas as JSON values, and a nullableanyOf/oneOfpair as an optional value (#647). ess generate schema types-bundle --integer-format-widthsrealizesint32andint64at native width (#648).ess generate types --declared-field-orderkeeps the order the specification declares, and--rust-box-only-recursionboxes only the references that close a cycle (#661). Without these options the output keeps its bytes.- Rust and web synthesis accept a response field that shares a name with an input field (#659).
Validation and mutation
ess specify validaterefuses awhen:branch whose input guard implies the guard of an input-guarded refusal answered before it, asunreachable_branch(#702). Before, only synthesis reported it.ess verify conform mutatescores a precedence swap of two guards no input selects together asequivalent, also for wide enums, membership lists and disjunctions (#703).
Since 0.70.0
- 0.76.0: schemas publish entity invariants and
Binary64, text length and distinct-list bounds as keywords; adefined/not definedpair of branches is exhaustive without a default;ess-composition/5compares events, commands, constraints and variant attributes; HTTP bindings name operation ids and servers. - 0.75.0: the workspace builds on its declared minimum Rust version again, and seeded synthesis explains the seeds it cannot use.
- 0.74.0: seeds are admitted for models whose actors declare caller attributes.
- 0.71.0 to 0.73.0: synthesis covers more set updates, deletes, bindings and related-row guards that it refused before.