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!("Import:");
    println!("{}", FmtImportTable { obj });
    println!();
}

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

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

        let rows = self
            .obj
            .import_table()
            .iter()
            .enumerate()
            .map(|(idx, import)| {
                let name = self.obj.fmt_string(import.name()).to_string();
                // def_lines, ref_lines については個数のみ表示。
                let def_lines = import.def_lines().len();
                let ref_lines = import.ref_lines().len();
                FmtImportTableRow {
                    idx,
                    name,
                    addr_size: import.addr_size(),
                    def_lines,
                    ref_lines,
                }
            });

        Table::new(rows)
            .with(Style::empty())
            .modify(Columns::single(0), Alignment::right()) // idx
            .modify(Columns::single(2), Alignment::right()) // addr_size
            .modify(Columns::single(3), Alignment::right()) // def_lines
            .modify(Columns::single(4), Alignment::right()) // ref_lines
            .fmt(f)
    }
}

#[derive(Debug, Tabled)]
struct FmtImportTableRow {
    idx: usize,
    name: String,
    addr_size: u8,
    def_lines: usize,
    ref_lines: usize,
}