use xo65::{metadata::Metadata, Xo65};
use crate::query::Xo65Query as _;
pub fn dump(obj: &Xo65) {
println!("Metadata:");
println!("{}", FmtMetadataTable { obj });
println!();
}
#[derive(Debug)]
struct FmtMetadataTable<'a, 'data> {
obj: &'a Xo65<'data>,
}
impl std::fmt::Display for FmtMetadataTable<'_, '_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use tabled::{
settings::{object::Rows, Remove, Style},
Table,
};
let fmt_str = |idx: u32| self.obj.fmt_string(idx).to_string();
let rows = self.obj.metadata_table().iter().map(|meta| match meta {
Metadata::Comment { str_idx } => ("Comment", fmt_str(*str_idx)),
Metadata::Author { str_idx } => ("Author", fmt_str(*str_idx)),
Metadata::Translator { str_idx } => ("Translator", fmt_str(*str_idx)),
Metadata::Compiler { str_idx } => ("Compiler", fmt_str(*str_idx)),
Metadata::Os { str_idx } => ("OS", fmt_str(*str_idx)),
Metadata::DateTime { unix_time } => {
let s = jiff::Timestamp::from_second(i64::from(*unix_time)).map_or_else(
|_| format!("{unix_time} (OUT OF RANGE)"),
|ts| ts.to_string(),
);
("DateTime", s)
}
});
Table::new(rows)
.with(Remove::row(Rows::first()))
.with(Style::empty())
.fmt(f)
}
}