//! One way to the contents of an entity, as you might do for debugging. A similar pattern could //! also be useful for serialization, or other row-oriented generic operations. type FormattingFunction = &'static dyn Fn(hecs::EntityRef<'_>) -> Option; fn format_entity(entity: hecs::EntityRef<'_>) -> String { fn fmt(entity: hecs::EntityRef<'_>) -> Option { Some(entity.get::<&T>()?.to_string()) } const FUNCTIONS: &[FormattingFunction] = &[&fmt::, &fmt::, &fmt::]; let mut out = String::new(); for f in FUNCTIONS { if let Some(x) = f(entity) { if out.is_empty() { out.push('['); } else { out.push_str(", "); } out.push_str(&x); } } if out.is_empty() { out.push_str("[]"); } else { out.push(']'); } out } fn main() { let mut world = hecs::World::new(); let e = world.spawn((42, true)); println!("{}", format_entity(world.entity(e).unwrap())); }