format: support whitespace padding in str formatting

This commit is contained in:
Neeraj Jaiswal 2023-02-24 21:26:13 +05:30 committed by Johannes Altmanninger
parent e384e63b24
commit b0ed37c2e0
2 changed files with 24 additions and 1 deletions

View file

@ -478,7 +478,7 @@ impl Printf for &wstr {
impl Printf for &str { impl Printf for &str {
fn format(&self, spec: &ConversionSpecifier) -> Result<WString> { fn format(&self, spec: &ConversionSpecifier) -> Result<WString> {
if spec.conversion_type == ConversionType::String { if spec.conversion_type == ConversionType::String {
Ok((*self).into()) add_padding((*self).into(), spec)
} else { } else {
Err(PrintfError::WrongType) Err(PrintfError::WrongType)
} }
@ -514,3 +514,19 @@ impl Printf for &WString {
self.as_utfstr().format(spec) self.as_utfstr().format(spec)
} }
} }
fn add_padding(mut s: WString, spec: &ConversionSpecifier) -> Result<WString> {
let width: usize = match spec.width {
NumericParam::Literal(w) => w,
_ => {
return Err(PrintfError::Unknown); // should not happen at this point!!
}
}
.try_into()
.unwrap_or_default();
if s.len() < width {
let padding = L!(" ").repeat(width - s.len());
s.insert_utfstr(0, &padding);
};
Ok(s)
}

View file

@ -29,6 +29,12 @@ fn check_fmt<T: Printf>(nfmt: &str, arg: T, expected: &str) {
assert_eq!(our_result, expected); assert_eq!(our_result, expected);
} }
fn check_fmt_2<T: Printf, T2: Printf>(nfmt: &str, arg: T, arg2: T2, expected: &str) {
let fmt: WString = nfmt.into();
let our_result = sprintf!(&fmt, arg, arg2);
assert_eq!(our_result, expected);
}
#[test] #[test]
fn test_int() { fn test_int() {
check_fmt("%d", 12, "12"); check_fmt("%d", 12, "12");
@ -89,6 +95,7 @@ fn test_str() {
"test % with string: FOO yay\n", "test % with string: FOO yay\n",
); );
check_fmt("test char %c", '~', "test char ~"); check_fmt("test char %c", '~', "test char ~");
check_fmt_2("%*ls", 5, "^", " ^");
} }
#[test] #[test]