//! Emite los patrones compartidos como **escena de cable** (`EscenaWire`)
//! serializada, para que el reproductor de wawa los pinte y se compare contra
//! el camino directo.
//!
//! Es una de las tres mitades de una verificación que no cabe en un proceso:
//! los backends de `llimphi-text` (`vello`, `cpu`, `wire`) son excluyentes, y
//! por eso este crate y `llimphi-wawa` viven en workspaces aparte. Acá compone
//! la jaula (backend `wire`, que **no shapea**); allá reproduce el kernel.
//!
//! ```bash
//! cargo run --manifest-path 02_ruway/llimphi/llimphi-jaula/Cargo.toml \
//! --no-default-features --features std --example emitir_patron --
//! ```
//!
//! **Sin el patrón de texto, y no es un olvido.** En el perfil `wire` medir una
//! cadena es una *pregunta* que cruza la frontera y contesta el otro lado —eso
//! es lo que W4 sacó de la jaula—. Un medidor sintético de este lado haría que
//! el layout reservara un ancho y el reproductor pintara los glifos con otro:
//! el test mediría esa discrepancia inventada y no la fidelidad del cable. Por
//! eso el medidor de acá **paniquea**: si alguien mete texto en el patrón, se
//! entera de por qué no puede estar en vez de leer un rojo confuso.
use llimphi_jaula::{Jaula, Medida, Peticion};
include!("../../escena_patron.rs");
fn medidor(p: &Peticion<'_>) -> Medida {
panic!(
"el patrón del cable no puede llevar texto: medir «{}» es una pregunta \
que contesta el otro lado de la frontera (ver el encabezado)",
p.cadena
);
}
fn main() {
let dir = std::env::args().nth(1).unwrap_or_else(|| {
eprintln!("uso: emitir_patron ");
std::process::exit(2);
});
let dir = std::path::PathBuf::from(dir);
std::fs::create_dir_all(&dir).expect("crear el directorio de salida");
let mut emitidos = 0;
for (nombre, vista) in patrones::<()>() {
if nombre.starts_with("texto") {
continue;
}
let mut jaula = Jaula::new(ANCHO as f32, ALTO as f32, medidor);
let _montado = jaula.fotograma(vista);
let bytes = postcard::to_allocvec(jaula.escena()).expect("serializar la escena");
let ruta = dir.join(format!("{nombre}.wire"));
std::fs::write(&ruta, &bytes).expect("escribir la escena");
println!("{nombre}: {} bytes de cable → {}", bytes.len(), ruta.display());
emitidos += 1;
}
println!("patrones emitidos: {emitidos}");
}