xo65 0.1.0

Library for parsing cc65 object files (xo65 format)
Documentation
use tabled::Tabled;

use xo65::Xo65;

use crate::query::Xo65Query as _;

pub fn dump(obj: &Xo65) {
    println!("File:");
    println!("{}", FmtFileTable { obj });
    println!();
}

#[derive(Debug)]
struct FmtFileTable<'a, 'data> {
    obj: &'a Xo65<'data>,
}

impl std::fmt::Display for FmtFileTable<'_, '_> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        use tabled::{
            settings::{object::Columns, Alignment, Style},
            Table,
        };

        let rows = self.obj.file_table().iter().enumerate().map(|(idx, file)| {
            let name = self.obj.fmt_string(file.name()).to_string();
            let mtime = jiff::Timestamp::from_second(i64::from(file.mtime())).map_or_else(
                |_| format!("{} (OUT OF RANGE)", file.mtime()),
                |ts| ts.to_string(),
            );
            FmtFileTableRow {
                idx,
                name,
                size: file.size(),
                mtime,
            }
        });

        Table::new(rows)
            .with(Style::empty())
            .modify(Columns::single(0), Alignment::right()) // idx
            .modify(Columns::single(2), Alignment::right()) // size
            .fmt(f)
    }
}

#[derive(Debug, Tabled)]
struct FmtFileTableRow {
    idx: usize,
    name: String,
    size: u32,
    mtime: String,
}