use ascii::*;
use std::{cmp::min, io::Write};
pub mod address_fmt;
pub use address_fmt::*;
pub mod byte_fmt;
pub use byte_fmt::*;
pub mod char_fmt;
pub use char_fmt::*;
pub mod groupping;
pub use groupping::*;
use std::io::Result;
pub trait AddressFormatting {
fn format<O: Write>(&self, addr: usize, out: &mut O) -> Result<()>;
fn separators(&self) -> &Separators;
}
pub trait ByteFormatting {
fn byte_order(&self) -> GroupAtomicity;
fn groupping(&self) -> Groupping;
fn bytes_per_row(&self) -> usize {
self.groupping().bytes_per_row()
}
fn format<O: Write>(&self, bytes: &[u8], byte_number_in_row: usize, out: &mut O) -> Result<usize>;
fn format_padding<O: Write>(&self, byte_number_in_row: usize, out: &mut O) -> Result<()>;
fn separators(&self) -> &Separators;
}
pub trait CharFormatting {
fn format<O: Write>(&self, bytes: &[u8], out: &mut O) -> Result<usize>;
fn format_padding<O: Write>(&self, byte_count: usize, out: &mut O) -> Result<()>;
fn separators(&self) -> &Separators;
}
#[derive(Clone)]
pub struct Separators {
pub(crate) trailing: Vec<u8>,
pub(crate) leading: Vec<u8>,
}
impl Separators {
pub fn new(trailing: &str, leaidng: &str) -> Self {
Self {
leading: Vec::from(leaidng),
trailing: Vec::from(trailing),
}
}
}
impl Default for Separators {
fn default() -> Self {
Self {
leading: Vec::from(" "),
trailing: Default::default(),
}
}
}