//! Why does an element's sprite fail to resolve? Dump the two name spaces. //! //! `parse_build` resolves an element to a sprite by looking its DECLARED name up //! in (a) the `.rat` record table, then (b) the `T8aD` child table. `pteff05.t32` //! is in neither -- the `T8aD` it wants is registered as `8AX` -- so it resolves //! to None and `compose` drops it without recording it as missing. This prints //! both spaces, so the link between the two can be CHECKED rather than assumed. //! //! cargo run -p sylpheed-formats --example name_resolution -- use sylpheed_formats::{pak, ui_layout}; fn main() { let path = std::env::args().nth(1).expect("usage: name_resolution [entry]"); let want: Option = std::env::args().nth(2).and_then(|s| s.parse().ok()); let ar = pak::PakArchive::open(&path).expect("open pak"); let entries: Vec<_> = ar.entries().to_vec(); for (i, e) in entries.iter().enumerate() { if want.is_some_and(|w| w != i) { continue; } let Ok(bytes) = ar.read(e) else { continue }; let Some(build) = ui_layout::parse_build(&bytes) else { continue }; let unresolved: Vec<&ui_layout::Element> = build .elements .iter() .filter(|el| el.sprite.is_none() && el.kind & 0x10 == 0) .collect(); let claimed: std::collections::HashSet<&str> = build.elements.iter().filter_map(|e| e.sprite.as_deref()).collect(); let unclaimed: Vec<&String> = build.sprites.keys().filter(|k| !claimed.contains(k.as_str())).collect(); if want.is_none() && unresolved.is_empty() && unclaimed.is_empty() { continue; } let un: Vec<&str> = unresolved.iter().map(|e| e.name.as_str()).collect(); let uc: Vec = unclaimed .iter() .map(|k| format!("{k}({} B)", build.sprites[*k].1)) .collect(); println!( "entry {i:3} {:2} elements UNRESOLVED {:?} UNCLAIMED {:?}", build.elements.len(), un, uc ); if want.is_some() { for el in &build.elements { let mark = if el.sprite.is_none() && el.kind & 0x10 == 0 { " <-- UNRESOLVED" } else { "" }; println!(" [{:2}] kind {:#06x} {:28} -> {:?}{mark}", el.index, el.kind, el.name, el.sprite); } } } }