Hold two markups at one position, as Op::Arms
A guard derives as a branch only when turning it off deletes bytes. A renderer
that draws one thing when a value is present and a different thing when it is
absent deletes nothing, so there was no gap to measure and no branch to make --
the case the derivation started refusing in f2d4dd9. The pager's numbered strip
is the site it was refused on: the page a reader is on is a readout where every
other page is a control, deliberately, because a control that reloads the page
it is on answers nothing.
`swapped` makes `shrunk`'s measurement and keeps both middles instead of one.
Both ends are pushed out past any sentinel they landed inside, since a maximal
common prefix runs into the middle of a hole whenever two renders put the same
one in the same place, and half a sentinel either side of an arm is `ZQH`
reaching a reader. Two separate differences become one wide swap, unchanged
middle and all, which rebuilds either render exactly; what it costs is room, so
`build` refuses a swap another site nests inside rather than dropping structure
the unrendered arm never showed.
The arms' holes are numbered in the level around them, not in an arm, which is
what lets one arm carry a hole the other does not: the strip's readout has a
page number and no address, its control has both. That falls out of holes being
filled by number rather than by position.
One call site in the generated filler for both shapes, because the macro cannot
know which the derivation will produce -- the fill program is written from the
declaration and the residual is derived by rendering it. `Cursor::choose` runs
the guarded item's own program on a branch and walks the chosen arm on arms.
/feed still does not derive, and no longer for a staging reason: it shares its
shapes with the library panel through a `Surface` argument, and a staged
`include` drops its arguments.
quasicoherent cbb63155.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
- Claude-Session
- https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
18 files changed,
+517 insertions,
-92 deletions
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.106.0"
|
|
3 |
+ |
version = "0.107.0"
|
| 4 |
4 |
|
description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.106" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.106" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
| 18 |
18 |
|
axum = "0.8.8"
|
| 19 |
19 |
|
http = "1.3.1"
|
| 20 |
20 |
|
tokio = { version = "1.50.0", features = ["rt"] }
|
| 21 |
21 |
|
|
| 22 |
22 |
|
[dev-dependencies]
|
| 23 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.106" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
| 24 |
24 |
|
tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
|
| 25 |
25 |
|
tower = { version = "0.5.3", features = ["util"] }
|
| 26 |
26 |
|
http-body-util = "0.1.3"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-basics"
|
| 3 |
|
- |
version = "0.106.0"
|
|
3 |
+ |
version = "0.107.0"
|
| 4 |
4 |
|
description = "The first-party widget set: named assemblies of primitives, shared across our apps"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.106" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
| 17 |
17 |
|
quasi-declare = { path = "../quasi-declare", version = "0.1" }
|
| 18 |
18 |
|
makeover-layout = "0.44"
|
| 19 |
19 |
|
|
| 21 |
21 |
|
# A widget's guarantees are claims about what a renderer draws, so they are
|
| 22 |
22 |
|
# tested against a real one rather than by walking the tree the assembly just
|
| 23 |
23 |
|
# built. The webview is the renderer that recognises names today.
|
| 24 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.106" }
|
| 25 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.106" }
|
|
24 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
|
25 |
+ |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.106.0"
|
|
3 |
+ |
version = "0.107.0"
|
| 4 |
4 |
|
description = "What a described screen costs to render, in time and in allocations"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 26 |
26 |
|
askama = ["dep:askama"]
|
| 27 |
27 |
|
|
| 28 |
28 |
|
[dependencies]
|
| 29 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.106" }
|
| 30 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.106" }
|
| 31 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.106" }
|
| 32 |
|
- |
quasi-immediate = { path = "../quasi-immediate", version = "0.106" }
|
|
29 |
+ |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
|
30 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
|
31 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.107" }
|
|
32 |
+ |
quasi-immediate = { path = "../quasi-immediate", version = "0.107" }
|
| 33 |
33 |
|
# `Serves` is the trait carrying `screen` and `fragment`, which is what the
|
| 34 |
34 |
|
# webview is measured through. Taken directly rather than through quasi-webview
|
| 35 |
35 |
|
# because a bench calling a trait method should name the trait it calls.
|
| 36 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.106" }
|
|
36 |
+ |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
| 37 |
37 |
|
# The macro under measurement. The bench holds the declared copy of the same
|
| 38 |
38 |
|
# screen `staging.rs` writes by hand, so the staged column measures what the
|
| 39 |
39 |
|
# server actually serves rather than a shape written for a benchmark.
|
| 31 |
31 |
|
trybuild = "1"
|
| 32 |
32 |
|
# The generated code names the vocabulary, so a case that is meant to COMPILE
|
| 33 |
33 |
|
# needs it. A proc-macro crate cannot depend on it outside dev.
|
| 34 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.106" }
|
|
34 |
+ |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-http"
|
| 3 |
|
- |
version = "0.106.0"
|
|
3 |
+ |
version = "0.107.0"
|
| 4 |
4 |
|
description = "The http-shaped seam quasi's webview host adapters share: decoding in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.106" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
| 17 |
17 |
|
http = "1.3.1"
|
| 18 |
18 |
|
form_urlencoded = "1.2.2"
|