Let a screen's markup be derived once and compiled in
The build-time half of the declaration transition (quasicoherent `793d99dd`).
Three pieces, and the first two are what the third needs.
`#[constant]` on a declaration. A proc macro sees one invocation and no
other, so a caller cannot read a callee's flags: two `declare!`s are two
expansions, often in two crates. The flag leaves behind a shim, `foo_constant`,
which is the shape under a second name and exists only under the flag. A
staged `include` whose arguments are all literal calls that instead of opening
a scope, so the callee is evaluated once while a residual is derived rather
than once per request. A shape that promised nothing has no shim and the call
does not resolve, which is the whole enforcement: literal arguments do not make
a callee fixed, and inlining on argument shape alone would bake one reading of
a clock into a residual and serve it forever.
`Residual` holds `Cow` rather than `Vec`, so one can be a `static`, and
`as_rust` writes a residual out as Rust source. Source and not a serialization
format: a format needs a writer, a reader, a version and a parse at startup,
and the parse is what the spike's template intermediate was rejected for. The
artifact is code and rustc is its only reader.
`Webview::served` writes the document around regions this renderer already
wrote. A screen's regions are fixed whenever nothing in them reads a request;
the document around them is not, because a shell carries whoever is looking.
That is the seam, and it is where the request stops mattering.
`Residual::settled` answers `Some` when a residual is one literal, which is
phase 2's sharp test spelled as a method.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
- Claude-Session
- https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
25 files changed,
+595 insertions,
-82 deletions
| 3474 |
3474 |
|
|
| 3475 |
3475 |
|
[[package]]
|
| 3476 |
3476 |
|
name = "quasi"
|
| 3477 |
|
- |
version = "0.102.0"
|
|
3477 |
+ |
version = "0.103.0"
|
| 3478 |
3478 |
|
|
| 3479 |
3479 |
|
[[package]]
|
| 3480 |
3480 |
|
name = "quasi-axum"
|
| 3481 |
|
- |
version = "0.102.0"
|
|
3481 |
+ |
version = "0.103.0"
|
| 3482 |
3482 |
|
dependencies = [
|
| 3483 |
3483 |
|
"axum",
|
| 3484 |
3484 |
|
"http",
|
| 3492 |
3492 |
|
|
| 3493 |
3493 |
|
[[package]]
|
| 3494 |
3494 |
|
name = "quasi-basics"
|
| 3495 |
|
- |
version = "0.102.0"
|
|
3495 |
+ |
version = "0.103.0"
|
| 3496 |
3496 |
|
dependencies = [
|
| 3497 |
3497 |
|
"makeover-layout",
|
| 3498 |
3498 |
|
"quasi-declare",
|
| 3503 |
3503 |
|
|
| 3504 |
3504 |
|
[[package]]
|
| 3505 |
3505 |
|
name = "quasi-bench"
|
| 3506 |
|
- |
version = "0.102.0"
|
|
3506 |
+ |
version = "0.103.0"
|
| 3507 |
3507 |
|
dependencies = [
|
| 3508 |
3508 |
|
"askama",
|
| 3509 |
3509 |
|
"dhat",
|
| 3524 |
3524 |
|
|
| 3525 |
3525 |
|
[[package]]
|
| 3526 |
3526 |
|
name = "quasi-declare"
|
| 3527 |
|
- |
version = "0.1.10"
|
|
3527 |
+ |
version = "0.1.11"
|
| 3528 |
3528 |
|
dependencies = [
|
| 3529 |
3529 |
|
"proc-macro2",
|
| 3530 |
3530 |
|
"quasi-router",
|
| 3536 |
3536 |
|
|
| 3537 |
3537 |
|
[[package]]
|
| 3538 |
3538 |
|
name = "quasi-http"
|
| 3539 |
|
- |
version = "0.102.0"
|
|
3539 |
+ |
version = "0.103.0"
|
| 3540 |
3540 |
|
dependencies = [
|
| 3541 |
3541 |
|
"form_urlencoded",
|
| 3542 |
3542 |
|
"http",
|
| 3545 |
3545 |
|
|
| 3546 |
3546 |
|
[[package]]
|
| 3547 |
3547 |
|
name = "quasi-immediate"
|
| 3548 |
|
- |
version = "0.102.0"
|
|
3548 |
+ |
version = "0.103.0"
|
| 3549 |
3549 |
|
dependencies = [
|
| 3550 |
3550 |
|
"docengine",
|
| 3551 |
3551 |
|
"egui",
|
| 3556 |
3556 |
|
|
| 3557 |
3557 |
|
[[package]]
|
| 3558 |
3558 |
|
name = "quasi-notifs"
|
| 3559 |
|
- |
version = "0.102.0"
|
|
3559 |
+ |
version = "0.103.0"
|
| 3560 |
3560 |
|
dependencies = [
|
| 3561 |
3561 |
|
"quasi-router",
|
| 3562 |
3562 |
|
"synckit-config",
|
| 3566 |
3566 |
|
|
| 3567 |
3567 |
|
[[package]]
|
| 3568 |
3568 |
|
name = "quasi-router"
|
| 3569 |
|
- |
version = "0.102.0"
|
|
3569 |
+ |
version = "0.103.0"
|
| 3570 |
3570 |
|
dependencies = [
|
| 3571 |
3571 |
|
"makeover-layout",
|
| 3572 |
3572 |
|
]
|
| 3583 |
3583 |
|
|
| 3584 |
3584 |
|
[[package]]
|
| 3585 |
3585 |
|
name = "quasi-tauri"
|
| 3586 |
|
- |
version = "0.102.0"
|
|
3586 |
+ |
version = "0.103.0"
|
| 3587 |
3587 |
|
dependencies = [
|
| 3588 |
3588 |
|
"http",
|
| 3589 |
3589 |
|
"quasi-http",
|
| 3594 |
3594 |
|
|
| 3595 |
3595 |
|
[[package]]
|
| 3596 |
3596 |
|
name = "quasi-tui"
|
| 3597 |
|
- |
version = "0.102.0"
|
|
3597 |
+ |
version = "0.103.0"
|
| 3598 |
3598 |
|
dependencies = [
|
| 3599 |
3599 |
|
"docengine",
|
| 3600 |
3600 |
|
"makeover",
|
| 3607 |
3607 |
|
|
| 3608 |
3608 |
|
[[package]]
|
| 3609 |
3609 |
|
name = "quasi-webview"
|
| 3610 |
|
- |
version = "0.102.0"
|
|
3610 |
+ |
version = "0.103.0"
|
| 3611 |
3611 |
|
dependencies = [
|
| 3612 |
3612 |
|
"docengine",
|
| 3613 |
3613 |
|
"makeover-layout",
|
| 6312 |
6312 |
|
"winnow 1.0.4",
|
| 6313 |
6313 |
|
]
|
| 6314 |
6314 |
|
|
|
6315 |
+ |
[[patch.unused]]
|
|
6316 |
+ |
name = "synckit-client"
|
|
6317 |
+ |
version = "0.10.0"
|
|
6318 |
+ |
|
| 6315 |
6319 |
|
[[patch.unused]]
|
| 6316 |
6320 |
|
name = "kberg"
|
| 6317 |
6321 |
|
version = "0.1.0"
|
| 6329 |
6333 |
|
version = "0.4.1"
|
| 6330 |
6334 |
|
|
| 6331 |
6335 |
|
[[patch.unused]]
|
| 6332 |
|
- |
name = "synckit-client"
|
| 6333 |
|
- |
version = "0.10.0"
|
|
6336 |
+ |
name = "makeover-build"
|
|
6337 |
+ |
version = "0.67.0"
|
| 6334 |
6338 |
|
|
| 6335 |
6339 |
|
[[patch.unused]]
|
| 6336 |
6340 |
|
name = "quasi-type"
|
| 6337 |
6341 |
|
version = "0.1.3"
|
| 6338 |
|
- |
|
| 6339 |
|
- |
[[patch.unused]]
|
| 6340 |
|
- |
name = "makeover-build"
|
| 6341 |
|
- |
version = "0.67.0"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.102.0"
|
|
3 |
+ |
version = "0.103.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.102" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.102" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.103" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.103" }
|
| 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.102" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.103" }
|
| 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.102.0"
|
|
3 |
+ |
version = "0.103.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.102" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.103" }
|
| 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.102" }
|
| 25 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.102" }
|
|
24 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.103" }
|
|
25 |
+ |
quasi-http = { path = "../quasi-http", version = "0.103" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.102.0"
|
|
3 |
+ |
version = "0.103.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.102" }
|
| 30 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.102" }
|
| 31 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.102" }
|
| 32 |
|
- |
quasi-immediate = { path = "../quasi-immediate", version = "0.102" }
|
|
29 |
+ |
quasi-router = { path = "../quasi-router", version = "0.103" }
|
|
30 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.103" }
|
|
31 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.103" }
|
|
32 |
+ |
quasi-immediate = { path = "../quasi-immediate", version = "0.103" }
|
| 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.102" }
|
|
36 |
+ |
quasi-http = { path = "../quasi-http", version = "0.103" }
|
| 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.
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-declare"
|
| 3 |
|
- |
version = "0.1.10"
|
|
3 |
+ |
version = "0.1.11"
|
| 4 |
4 |
|
description = "The declare! form: a screen description compiled to Rust at build time."
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 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.102" }
|
|
34 |
+ |
quasi-router = { path = "../quasi-router", version = "0.103" }
|