diff options
Diffstat (limited to 'vendor/powerfmt/src/ext.rs')
-rw-r--r-- | vendor/powerfmt/src/ext.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/powerfmt/src/ext.rs b/vendor/powerfmt/src/ext.rs new file mode 100644 index 0000000..20af7c0 --- /dev/null +++ b/vendor/powerfmt/src/ext.rs @@ -0,0 +1,54 @@ +//! Extension traits. + +use core::fmt::{Alignment, Arguments, Formatter, Result, Write}; + +mod sealed { + pub trait Sealed {} + + impl Sealed for core::fmt::Formatter<'_> {} +} + +/// An extension trait for [`core::fmt::Formatter`]. +pub trait FormatterExt: sealed::Sealed { + /// Writes the given arguments to the formatter, padding them with the given width. If `width` + /// is incorrect, the resulting output will not be the requested width. + fn pad_with_width(&mut self, width: usize, args: Arguments<'_>) -> Result; +} + +impl FormatterExt for Formatter<'_> { + fn pad_with_width(&mut self, args_width: usize, args: Arguments<'_>) -> Result { + let Some(final_width) = self.width() else { + // The caller has not requested a width. Write the arguments as-is. + return self.write_fmt(args); + }; + let Some(fill_width @ 1..) = final_width.checked_sub(args_width) else { + // No padding will be present. Write the arguments as-is. + return self.write_fmt(args); + }; + + let alignment = self.align().unwrap_or(Alignment::Left); + let fill = self.fill(); + + let left_fill_width = match alignment { + Alignment::Left => 0, + Alignment::Right => fill_width, + Alignment::Center => fill_width / 2, + }; + let right_fill_width = match alignment { + Alignment::Left => fill_width, + Alignment::Right => 0, + // When the fill is not even on both sides, the extra fill goes on the right. + Alignment::Center => (fill_width + 1) / 2, + }; + + for _ in 0..left_fill_width { + self.write_char(fill)?; + } + self.write_fmt(args)?; + for _ in 0..right_fill_width { + self.write_char(fill)?; + } + + Ok(()) + } +} |