Status and roadmap
What works today, what is missing, and where the name came from.
Carte is pre-release: version 0.1.0, not on crates.io, with no stability promise. The routing half already has several applications built on it. The state half is newer, and the API of both still changes.
The name
Carte was developed under the working name structure; the crate is now carte. It was extracted from Masque, a Rust UI language, where it was the routing and scoped-state layer. Pulling it out meant cutting every edge to the UI side, which is why it now depends on nothing.
The working name was never meant to ship. The crate is not published yet, and its manifest says so.
- The public name is Carte. TODO: confirm, along with the crate name and domain.
- The name
carteon crates.io is currently held by an unrelated project. TODO: the published crate name. - Until then, depend on it by Git or path. See Installation.
Masque does not depend on Carte, and Carte does not depend on Masque. A future binding crate may join them for apps that want both.
Works today
- Route tables: roots, multi-parent edges, occlusion, guards, tiers and areas, with startup validation.
- The router: the derived walk, lifecycle, Escape offered deepest first, popping, departure, and the two occlusion lists.
- Guards, evaluated in the walk and ahead of time with
Router::ask. - The store: process and node scopes, mounting driven by the walk, typed reads, version stamps and per-field subscriptions.
- Producers with claimed fields, equality-checked sets, declared grain, and a single commit per tick.
- Schema reflection, structural comparison, and the printed schema form.
- Intent vocabularies, typed decoding of named raises, and the outbox.
- Validation in two grades.
- The
notesexample and its windowless tests.
In progress
- Moving the
SchemaandIntentsderive macros into the crate. Today they live in a separate, unpublished crate, so every schema and vocabulary in these docs is written by hand. - Settling the
Nodetrait. It is scaffolding cut at the seam where Masque's routing layer named UI types, and methods such asoccludesandtake_leave_requestare expected to move or retire. - A first release on crates.io, under the final name.
Not yet
- Keyed collections. A
Vecis one field today, so changing one row wakes everyone watching the list. Keyed collections are the planned fix. - Optional fields in Rust. A field can be declared absent with
absent_when, but there is noSchemaimpl forOption<T>. TODO: decide the representation. - Producer ordering. Producers run in the order you call them. There is no declared dependency between derived producers.
- A validation harness. Validation takes lists of fields and raises. Nothing yet extracts those from egui views, Masque documents or anything else.
- Thread safety. The store and the router are not
Send. Keep them on your UI thread. - A licence file. The crate declares
license = "MIT"in its manifest, but the repository has noLICENSEfile yet. TODO: add one before the first release. - A stability promise.
Out of scope
Carte is not URL routing, and is not planned to become it. There are no path parameters, no query strings, no history stack and no deep links. Route ids are &'static str values fixed at startup.
TODO: decide whether a URL or deep-link layer belongs in a separate crate on top of Carte, mapping a URL to model state that the walk then reads. It would not change Carte itself.