tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
chore: refresco desde el monorepo — vello 0.9 / wgpu 29, 120 miembros
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}