mod error;
mod input;
mod section;
mod unit;
use core::fmt::{Formatter, Result};
pub use self::error::ErrorDisplay;
pub use self::input::{InputDisplay, PreferredFormat};
pub trait DisplayBase {
fn fmt(&self, w: &mut dyn Write) -> Result;
}
impl<T> DisplayBase for &T
where
T: DisplayBase,
{
fn fmt(&self, w: &mut dyn Write) -> Result {
(**self).fmt(w)
}
}
impl DisplayBase for &'static str {
fn fmt(&self, w: &mut dyn Write) -> Result {
w.write_str(self)
}
}
pub trait Write {
fn write_str(&mut self, s: &str) -> Result;
fn write_char(&mut self, c: char) -> Result;
fn write_usize(&mut self, v: usize) -> Result;
fn write_hex(&mut self, b: u8) -> Result {
fn digit(b: u8) -> char {
if b > 9 {
(b'a' + (b - 10)) as char
} else {
(b'0' + b) as char
}
}
self.write_char(digit(b >> 4))?;
self.write_char(digit(b & 0x0F))
}
}
impl<T> Write for &mut T
where
T: Write,
{
fn write_str(&mut self, s: &str) -> Result {
(**self).write_str(s)
}
fn write_char(&mut self, c: char) -> Result {
(**self).write_char(c)
}
fn write_usize(&mut self, v: usize) -> Result {
(**self).write_usize(v)
}
fn write_hex(&mut self, b: u8) -> Result {
(**self).write_hex(b)
}
}
impl<'a> Write for Formatter<'a> {
fn write_str(&mut self, s: &str) -> Result {
core::fmt::Write::write_str(self, s)
}
fn write_char(&mut self, c: char) -> Result {
core::fmt::Write::write_char(self, c)
}
fn write_usize(&mut self, v: usize) -> Result {
core::fmt::Display::fmt(&v, self)
}
}
pub(crate) fn byte_count(w: &mut dyn Write, count: usize) -> Result {
match count {
0 => w.write_str("no bytes"),
1 => w.write_str("1 byte"),
n => {
w.write_usize(n)?;
w.write_str(" bytes")
}
}
}