use crate::TSpan;
use core::fmt;
fn write_fractional(subsec: u64, precision: usize, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if precision == 0 {
return Ok(());
}
let prec = precision.min(18); let scale = 10u64.pow(18 - prec as u32);
let value = subsec / scale;
write!(f, ".{:0>width$}", value, width = prec)
}
impl fmt::Display for TSpan {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let precision = f.precision().unwrap_or(9);
if self.is_zero() {
let sign = if f.sign_plus() { "+" } else { "" };
write!(f, "{sign}0")?;
if f.alternate() {
write!(f, " [sec=0 subsec=0]")?;
}
f.write_str(" s")?;
return Ok(());
}
if f.sign_plus() && self.sec >= 0 {
write!(f, "+")?;
}
write!(f, "{}", self.sec)?;
write_fractional(self.attos, precision, f)?;
f.write_str(" s")?;
if f.alternate() {
write!(f, " [sec={} subsec={}]", self.sec, self.attos)?;
}
Ok(())
}
}
impl fmt::Debug for TSpan {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TSpan")
.field("sec", &self.sec)
.field("subsec", &self.attos)
.finish()
}
}