tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 660Markdown 302TOML 157RON 312382 Sutichaykuna

⎇ main llimphi-jaula/examples/emitir_patron.rs Rust · 57 siq'ikuna · 2.4 KB Ñawpa willay Pi imata llamkarqan ch'uya

chore: refresco desde el monorepo — vello 0.9 / wgpu 29, 120 miembros d251eb32b · Sergio ·

1//! Emite los patrones compartidos como **escena de cable** (`EscenaWire`)
2//! serializada, para que el reproductor de wawa los pinte y se compare contra
3//! el camino directo.
4//!
5//! Es una de las tres mitades de una verificación que no cabe en un proceso:
6//! los backends de `llimphi-text` (`vello`, `cpu`, `wire`) son excluyentes, y
7//! por eso este crate y `llimphi-wawa` viven en workspaces aparte. Acá compone
8//! la jaula (backend `wire`, que **no shapea**); allá reproduce el kernel.
9//!
10//! ```bash
11//! cargo run --manifest-path 02_ruway/llimphi/llimphi-jaula/Cargo.toml \
12//!   --no-default-features --features std --example emitir_patron -- <dir>
13//! ```
14//!
15//! **Sin el patrón de texto, y no es un olvido.** En el perfil `wire` medir una
16//! cadena es una *pregunta* que cruza la frontera y contesta el otro lado —eso
17//! es lo que W4 sacó de la jaula—. Un medidor sintético de este lado haría que
18//! el layout reservara un ancho y el reproductor pintara los glifos con otro:
19//! el test mediría esa discrepancia inventada y no la fidelidad del cable. Por
20//! eso el medidor de acá **paniquea**: si alguien mete texto en el patrón, se
21//! entera de por qué no puede estar en vez de leer un rojo confuso.
22
23use llimphi_jaula::{Jaula, Medida, Peticion};
24
25include!("../../escena_patron.rs");
26
27fn medidor(p: &Peticion<'_>) -> Medida {
28    panic!(
29        "el patrón del cable no puede llevar texto: medir «{}» es una pregunta \
30         que contesta el otro lado de la frontera (ver el encabezado)",
31        p.cadena
32    );
33}
34
35fn main() {
36    let dir = std::env::args().nth(1).unwrap_or_else(|| {
37        eprintln!("uso: emitir_patron <dir-de-salida>");
38        std::process::exit(2);
39    });
40    let dir = std::path::PathBuf::from(dir);
41    std::fs::create_dir_all(&dir).expect("crear el directorio de salida");
42
43    let mut emitidos = 0;
44    for (nombre, vista) in patrones::<()>() {
45        if nombre.starts_with("texto") {
46            continue;
47        }
48        let mut jaula = Jaula::new(ANCHO as f32, ALTO as f32, medidor);
49        let _montado = jaula.fotograma(vista);
50        let bytes = postcard::to_allocvec(jaula.escena()).expect("serializar la escena");
51        let ruta = dir.join(format!("{nombre}.wire"));
52        std::fs::write(&ruta, &bytes).expect("escribir la escena");
53        println!("{nombre}: {} bytes de cable → {}", bytes.len(), ruta.display());
54        emitidos += 1;
55    }
56    println!("patrones emitidos: {emitidos}");
57}