use core::marker::PhantomData;
use crate::{EncodeStr, Error};
pub struct Pad<E: EncodeStr, M> {
inner: E,
width: usize,
pad: char,
mode: PhantomData<M>
}
pub struct Left;
pub struct Right;
pub type PadLeft<E> = Pad<E, Left>;
pub type PadRight<E> = Pad<E, Right>;
impl <E: EncodeStr, M> Pad<E, M> {
pub const fn new(inner: E, width: usize, pad: char) -> Self {
Self{
inner,
width,
pad,
mode: PhantomData,
}
}
}
impl <E: EncodeStr> EncodeStr for PadRight<E> {
fn len(&self) -> usize {
self.width.max(self.inner.len())
}
fn write(&self, buff: &mut [u8]) -> Result<usize, Error> {
let n = self.inner.len();
let m = self.width.max(n);
self.inner.write(buff)?;
for i in n..m {
buff[i] = self.pad as u8;
}
Ok(m)
}
}
impl <E: EncodeStr> EncodeStr for PadLeft<E> {
fn len(&self) -> usize {
self.width.max(self.inner.len())
}
fn write(&self, buff: &mut [u8]) -> Result<usize, Error> {
let n = self.inner.len();
let p = self.width.max(n) - n;
for i in 0..p {
buff[i] = self.pad as u8;
}
self.inner.write(&mut buff[p..])?;
Ok(n + p)
}
}
#[cfg(test)]
mod test {
use crate::write_str;
use super::*;
#[test]
fn test_pad_right() {
let mut buff = [0u8; 32];
let tests = &[
(PadRight::new("123", 6, ' '), "123 "),
(PadRight::new("123", 2, ' '), "123"),
];
for (p, s) in tests {
let v = write_str!(&mut buff[..], p);
assert_eq!(v, Ok(*s));
}
}
#[test]
fn test_pad_left() {
let mut buff = [0u8; 32];
let tests = &[
(PadLeft::new("123", 6, ' '), " 123"),
(PadLeft::new("123", 2, ' '), "123"),
];
for (p, s) in tests {
let v = write_str!(&mut buff[..], p);
assert_eq!(v, Ok(*s));
}
}
}