xo65 0.1.0

Library for parsing cc65 object files (xo65 format)
Documentation
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)
    }
}