use crate::{Arguments, Display, Restyle, Result, Style, Write};
#[doc(hidden)] #[derive(Clone, Copy, Debug)]
pub enum Align {
Left,
Center,
Right,
}
#[doc(hidden)] #[derive(Clone, Copy, Debug)]
pub enum Sign {
Plus,
Minus,
}
#[doc(hidden)] #[derive(Clone, Copy, Debug)]
pub enum DebugHex {
Lower,
Upper,
}
#[doc(hidden)] #[derive(Clone, Copy, Debug, Default)]
pub struct FormatterArgs<'a> {
pub align: Option<Align>,
pub sign: Option<Sign>,
pub alternate: bool,
pub zero: bool,
pub width: Option<&'a usize>,
pub precision: Option<&'a usize>,
pub debug_hex: Option<DebugHex>,
}
pub struct Formatter<'a> {
style: Style,
pub(crate) format: FormatterArgs<'a>,
write: &'a mut (dyn Write + 'a),
}
impl core::fmt::Debug for Formatter<'_> {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result {
f.debug_struct("Formatter")
.field("style", &self.style)
.field("format", &self.format)
.finish()
}
}
impl<'a> Formatter<'a> {
#[inline]
pub(crate) fn new(write: &'a mut (dyn Write + 'a)) -> Self {
Self {
style: Style::default(),
format: FormatterArgs::default(),
write,
}
}
pub fn with(&mut self, restyle: impl Restyle) -> Formatter<'_> {
Formatter {
write: &mut *self.write,
format: self.format,
style: self.style.with(restyle),
}
}
#[doc(hidden)]
pub fn with_args<'b>(
&'b mut self,
format: &FormatterArgs<'b>,
restyle: impl Restyle,
) -> Formatter<'b> {
Formatter {
write: &mut *self.write,
format: *format,
style: self.style.with(restyle),
}
}
#[inline]
pub fn write_str(&mut self, s: &str) -> Result {
self.write.write_str(s, self.style)?;
Ok(())
}
#[inline]
pub fn write_fmt(&mut self, args: Arguments<'_>) -> Result {
args.fmt(self)?;
Ok(())
}
}
impl<'a> Write for Formatter<'a> {
#[inline]
fn write_str(&mut self, s: &str, style: Style) -> Result {
self.with(style).write_str(s)
}
#[inline]
fn write_fmt(&mut self, args: Arguments<'_>) -> Result {
self.write_fmt(args)
}
}
impl<'a> core::fmt::Write for Formatter<'a> {
#[inline]
fn write_str(&mut self, s: &str) -> Result {
self.write_str(s)
}
}