ddbug 0.5.0

Display debugging information
Documentation
use parser::Range;

use crate::Result;
use crate::print::{DiffState, Print, PrintState, ValuePrinter};

pub(crate) fn print_address(range: &Range, w: &mut dyn ValuePrinter) -> Result<()> {
    if range.end > range.begin {
        write!(w, "0x{:x}-0x{:x}", range.begin, range.end - 1)?;
    } else {
        write!(w, "0x{:x}", range.begin)?;
    }
    Ok(())
}

pub(crate) fn print_address_and_size(range: &Range, w: &mut dyn ValuePrinter) -> Result<()> {
    if range.end > range.begin {
        write!(
            w,
            "0x{:x}-0x{:x} ({})",
            range.begin,
            range.end - 1,
            range.end - range.begin
        )?;
    } else {
        write!(w, "0x{:x}", range.begin)?;
    }
    Ok(())
}

impl Print for Range {
    type Arg = ();

    fn print(&self, state: &mut PrintState, _arg: &()) -> Result<()> {
        state.line(|w, _state| print_address_and_size(self, w))
    }

    fn diff(state: &mut DiffState, _arg_a: &(), a: &Self, _arg_b: &(), b: &Self) -> Result<()> {
        state.line(a, b, |w, _state, x| print_address_and_size(x, w))
    }
}