Commit 6647c3f054

data-man <datamanrb@gmail.com>
2020-05-13 15:07:52
Fixes fmt padding for some types
1 parent e05923f
Changed files (1)
lib
lib/std/fmt.zig
@@ -334,16 +334,16 @@ pub fn formatType(
             return formatValue(value, fmt, options, out_stream);
         },
         .Void => {
-            return out_stream.writeAll("void");
+            return formatBuf("void", options, out_stream);
         },
         .Bool => {
-            return out_stream.writeAll(if (value) "true" else "false");
+            return formatBuf(if (value) "true" else "false", options, out_stream);
         },
         .Optional => {
             if (value) |payload| {
                 return formatType(payload, fmt, options, out_stream, max_depth);
             } else {
-                return out_stream.writeAll("null");
+                return formatBuf("null", options, out_stream);
             }
         },
         .ErrorUnion => {
@@ -495,7 +495,7 @@ fn formatValue(
     switch (@typeInfo(T)) {
         .Float => return formatFloatValue(value, fmt, options, out_stream),
         .Int, .ComptimeInt => return formatIntValue(value, fmt, options, out_stream),
-        .Bool => return out_stream.writeAll(if (value) "true" else "false"),
+        .Bool => return formatBuf(if (value) "true" else "false", options, out_stream),
         else => comptime unreachable,
     }
 }
@@ -561,9 +561,7 @@ pub fn formatText(
     options: FormatOptions,
     out_stream: var,
 ) !void {
-    if (fmt.len == 0) {
-        return out_stream.writeAll(bytes);
-    } else if (comptime std.mem.eql(u8, fmt, "s")) {
+    if (comptime std.mem.eql(u8, fmt, "s") or (fmt.len == 0)) {
         return formatBuf(bytes, options, out_stream);
     } else if (comptime (std.mem.eql(u8, fmt, "x") or std.mem.eql(u8, fmt, "X"))) {
         for (bytes) |c| {
@@ -588,13 +586,30 @@ pub fn formatBuf(
     options: FormatOptions,
     out_stream: var,
 ) !void {
-    try out_stream.writeAll(buf);
-
-    const width = options.width orelse 0;
-    var leftover_padding = if (width > buf.len) (width - buf.len) else return;
+    const width = options.width orelse buf.len;
+    const alignment = options.alignment orelse .Left;
+    var padding = if (width > buf.len) (width - buf.len) else 0;
     const pad_byte = [1]u8{options.fill};
-    while (leftover_padding > 0) : (leftover_padding -= 1) {
-        try out_stream.writeAll(&pad_byte);
+    switch (alignment) {
+        .Left => {
+            try out_stream.writeAll(buf);
+            while (padding > 0) : (padding -= 1) {
+                try out_stream.writeAll(&pad_byte);
+            }
+        },
+        .Center => {
+            const padl = padding / 2;
+            var i: usize = 0;
+            while (i < padl) : (i += 1) try out_stream.writeAll(&pad_byte);
+            try out_stream.writeAll(buf);
+            while (i < padding) : (i += 1) try out_stream.writeAll(&pad_byte);
+        },
+        .Right => {
+            while (padding > 0) : (padding -= 1) {
+                try out_stream.writeAll(&pad_byte);
+            }
+            try out_stream.writeAll(buf);
+        },
     }
 }
 
@@ -1686,3 +1701,16 @@ test "vector" {
 test "enum-literal" {
     try testFmt(".hello_world", "{}", .{.hello_world});
 }
+
+test "padding" {
+    try testFmt("Simple", "{}", .{"Simple"});
+    try testFmt("true      ", "{:10}", .{true});
+    try testFmt("      true", "{:>10}", .{true});
+    try testFmt("======true", "{:=>10}", .{true});
+    try testFmt("true======", "{:=<10}", .{true});
+    try testFmt("   true   ", "{:^10}", .{true});
+    try testFmt("===true===", "{:=^10}", .{true});
+    try testFmt("Minimum            width", "{:18} width", .{"Minimum"});
+    try testFmt("==================Filled", "{:=>24}", .{"Filled"});
+    try testFmt("        Centered        ", "{:^24}", .{"Centered"});
+}