Add Sought::Save, and answer one ask with every file picked
Two findings from the audiofiles picker conversion, both ruled by Max on
2026-08-25 as vocabulary rather than host-side work. They are separate
questions: one is about the ask, the other about the answer.
`7fda7ae3`. `Sought` had three read pickers and no way to say the reader
is naming a file that does not exist yet, so the classifier export, which
opens a save dialog seeded with `{export_name}.afcl`, had nowhere to put
its suggested name. `Sought::Save` carries the name and an accept list,
using `Accepted` the way `File` and `Files` do. The note that said a save
dialog was `Outcome::File`'s is corrected in place: that member is a
payload that exists when the route answers, this is a destination chosen
before there is anything to put in it.
`8a246c02`. `Locating::answered` took one handle, so a `Sought::Files`
ask was answered once per file and every host half wrote the loop. It now
takes every `Picked` and builds one request, with the handles repeating
under `under` and their labels beside them, which is what `Params` is a
list of pairs for. There is deliberately no single-handle method left:
the door is what produced the loop. Answering with no picks is no call,
which is what a cancelled dialog is.
The cascade: quasi-http refuses each shape by name now rather than the
class, so a browser and a Tauri window say which dialog they cannot open;
quasi-tui states the terminal's fallback for a save, which is the working
directory joined to `safe_file_name` of the suggestion, said out loud;
quasi-immediate states the native save dialog and the fallback for a host
without one. Tests at the router, http, tui and immediate levels.
Breaking, so 0.62.0 to 0.63.0 across the workspace and in the template's
pins. The consumers (goingson, audiofiles, MNW server) are still on 0.62
and are the next pass; a push is blocked by the internal-deps gate until
they move.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
22 files changed,
+641 insertions,
-77 deletions
| 3414 |
3414 |
|
|
| 3415 |
3415 |
|
[[package]]
|
| 3416 |
3416 |
|
name = "quasi"
|
| 3417 |
|
- |
version = "0.62.0"
|
|
3417 |
+ |
version = "0.63.0"
|
| 3418 |
3418 |
|
|
| 3419 |
3419 |
|
[[package]]
|
| 3420 |
3420 |
|
name = "quasi-axum"
|
| 3421 |
|
- |
version = "0.62.0"
|
|
3421 |
+ |
version = "0.63.0"
|
| 3422 |
3422 |
|
dependencies = [
|
| 3423 |
3423 |
|
"axum",
|
| 3424 |
3424 |
|
"http",
|
| 3432 |
3432 |
|
|
| 3433 |
3433 |
|
[[package]]
|
| 3434 |
3434 |
|
name = "quasi-basics"
|
| 3435 |
|
- |
version = "0.62.0"
|
|
3435 |
+ |
version = "0.63.0"
|
| 3436 |
3436 |
|
dependencies = [
|
| 3437 |
3437 |
|
"makeover-layout",
|
| 3438 |
3438 |
|
"quasi-http",
|
| 3442 |
3442 |
|
|
| 3443 |
3443 |
|
[[package]]
|
| 3444 |
3444 |
|
name = "quasi-bench"
|
| 3445 |
|
- |
version = "0.62.0"
|
|
3445 |
+ |
version = "0.63.0"
|
| 3446 |
3446 |
|
dependencies = [
|
| 3447 |
3447 |
|
"dhat",
|
| 3448 |
3448 |
|
"makeover",
|
| 3457 |
3457 |
|
|
| 3458 |
3458 |
|
[[package]]
|
| 3459 |
3459 |
|
name = "quasi-http"
|
| 3460 |
|
- |
version = "0.62.0"
|
|
3460 |
+ |
version = "0.63.0"
|
| 3461 |
3461 |
|
dependencies = [
|
| 3462 |
3462 |
|
"form_urlencoded",
|
| 3463 |
3463 |
|
"http",
|
| 3466 |
3466 |
|
|
| 3467 |
3467 |
|
[[package]]
|
| 3468 |
3468 |
|
name = "quasi-immediate"
|
| 3469 |
|
- |
version = "0.62.0"
|
|
3469 |
+ |
version = "0.63.0"
|
| 3470 |
3470 |
|
dependencies = [
|
| 3471 |
3471 |
|
"docengine",
|
| 3472 |
3472 |
|
"egui",
|
| 3476 |
3476 |
|
|
| 3477 |
3477 |
|
[[package]]
|
| 3478 |
3478 |
|
name = "quasi-notifs"
|
| 3479 |
|
- |
version = "0.62.0"
|
|
3479 |
+ |
version = "0.63.0"
|
| 3480 |
3480 |
|
dependencies = [
|
| 3481 |
3481 |
|
"quasi-router",
|
| 3482 |
3482 |
|
"synckit-config",
|
| 3484 |
3484 |
|
|
| 3485 |
3485 |
|
[[package]]
|
| 3486 |
3486 |
|
name = "quasi-router"
|
| 3487 |
|
- |
version = "0.62.0"
|
|
3487 |
+ |
version = "0.63.0"
|
| 3488 |
3488 |
|
dependencies = [
|
| 3489 |
3489 |
|
"makeover-layout",
|
| 3490 |
3490 |
|
]
|
| 3501 |
3501 |
|
|
| 3502 |
3502 |
|
[[package]]
|
| 3503 |
3503 |
|
name = "quasi-tauri"
|
| 3504 |
|
- |
version = "0.62.0"
|
|
3504 |
+ |
version = "0.63.0"
|
| 3505 |
3505 |
|
dependencies = [
|
| 3506 |
3506 |
|
"http",
|
| 3507 |
3507 |
|
"quasi-http",
|
| 3514 |
3514 |
|
|
| 3515 |
3515 |
|
[[package]]
|
| 3516 |
3516 |
|
name = "quasi-tui"
|
| 3517 |
|
- |
version = "0.62.0"
|
|
3517 |
+ |
version = "0.63.0"
|
| 3518 |
3518 |
|
dependencies = [
|
| 3519 |
3519 |
|
"docengine",
|
| 3520 |
3520 |
|
"makeover",
|
| 3526 |
3526 |
|
|
| 3527 |
3527 |
|
[[package]]
|
| 3528 |
3528 |
|
name = "quasi-webview"
|
| 3529 |
|
- |
version = "0.62.0"
|
|
3529 |
+ |
version = "0.63.0"
|
| 3530 |
3530 |
|
dependencies = [
|
| 3531 |
3531 |
|
"docengine",
|
| 3532 |
3532 |
|
"makeover-layout",
|
| 6197 |
6197 |
|
"winnow 1.0.4",
|
| 6198 |
6198 |
|
]
|
| 6199 |
6199 |
|
|
|
6200 |
+ |
[[patch.unused]]
|
|
6201 |
+ |
name = "synckit-client"
|
|
6202 |
+ |
version = "0.9.1"
|
|
6203 |
+ |
|
| 6200 |
6204 |
|
[[patch.unused]]
|
| 6201 |
6205 |
|
name = "quasi-type"
|
| 6202 |
6206 |
|
version = "0.1.0"
|
| 6216 |
6220 |
|
[[patch.unused]]
|
| 6217 |
6221 |
|
name = "tagtree"
|
| 6218 |
6222 |
|
version = "0.4.1"
|
| 6219 |
|
- |
|
| 6220 |
|
- |
[[patch.unused]]
|
| 6221 |
|
- |
name = "synckit-client"
|
| 6222 |
|
- |
version = "0.9.1"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.62.0"
|
|
3 |
+ |
version = "0.63.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.62.0" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.62.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.63.0" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.63.0" }
|
| 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.62.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.63.0" }
|
| 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.62.0"
|
|
3 |
+ |
version = "0.63.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.62.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.63.0" }
|
| 17 |
17 |
|
makeover-layout = "0.35.0"
|
| 18 |
18 |
|
|
| 19 |
19 |
|
[dev-dependencies]
|
| 20 |
20 |
|
# A widget's guarantees are claims about what a renderer draws, so they are
|
| 21 |
21 |
|
# tested against a real one rather than by walking the tree the assembly just
|
| 22 |
22 |
|
# built. The webview is the renderer that recognises names today.
|
| 23 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.62.0" }
|
| 24 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.62.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.63.0" }
|
|
24 |
+ |
quasi-http = { path = "../quasi-http", version = "0.63.0" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.62.0"
|
|
3 |
+ |
version = "0.63.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
|
| 22 |
22 |
|
count = ["dep:dhat"]
|
| 23 |
23 |
|
|
| 24 |
24 |
|
[dependencies]
|
| 25 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.62.0" }
|
| 26 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.62.0" }
|
| 27 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.62.0" }
|
|
25 |
+ |
quasi-router = { path = "../quasi-router", version = "0.63.0" }
|
|
26 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.63.0" }
|
|
27 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.63.0" }
|
| 28 |
28 |
|
# `Serves` is the trait carrying `screen` and `fragment`, which is what the
|
| 29 |
29 |
|
# webview is measured through. Taken directly rather than through quasi-webview
|
| 30 |
30 |
|
# because a bench calling a trait method should name the trait it calls.
|
| 31 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.62.0" }
|
|
31 |
+ |
quasi-http = { path = "../quasi-http", version = "0.63.0" }
|
| 32 |
32 |
|
makeover-layout = "0.35.0"
|
| 33 |
33 |
|
makeover-tui = { version = "0.33.0", features = ["theme"] }
|
| 34 |
34 |
|
# Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-http"
|
| 3 |
|
- |
version = "0.62.0"
|
|
3 |
+ |
version = "0.63.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.62.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.63.0" }
|
| 17 |
17 |
|
http = "1.3.1"
|
| 18 |
18 |
|
form_urlencoded = "1.2.2"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-immediate"
|
| 3 |
|
- |
version = "0.62.0"
|
|
3 |
+ |
version = "0.63.0"
|
| 4 |
4 |
|
edition = "2024"
|
| 5 |
5 |
|
description = "The immediate-mode renderer for quasi-router: a described screen in, an egui frame out. Immediate mode is the constraint that matters, not the library."
|
| 6 |
6 |
|
license = "MIT"
|
| 12 |
12 |
|
categories = ["gui"]
|
| 13 |
13 |
|
|
| 14 |
14 |
|
[dependencies]
|
| 15 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.62.0" }
|
|
15 |
+ |
quasi-router = { path = "../quasi-router", version = "0.63.0" }
|
| 16 |
16 |
|
# The node drawing, which is the makeover layer's and not this crate's. Every
|
| 17 |
17 |
|
# widget here that is not a container comes from it: a screen walk that painted
|
| 18 |
18 |
|
# its own meter would be the divergence the suite exists to end, one copy per
|