| ... | @@ -1083,6 +1083,8 @@ pub fn bufPrint(buf: []u8, comptime fmt: []const u8, args: var) BufPrintError![] | ... | @@ -1083,6 +1083,8 @@ pub fn bufPrint(buf: []u8, comptime fmt: []const u8, args: var) BufPrintError![] |
| 1083 | format(fbs.outStream(), fmt, args) catch |err| switch (err) { | 1083 | format(fbs.outStream(), fmt, args) catch |err| switch (err) { |
| 1084 | error.NoSpaceLeft => return error.BufferTooSmall, | 1084 | error.NoSpaceLeft => return error.BufferTooSmall, |
| 1085 | }; | 1085 | }; |
| | 1086 | //TODO: should we change one of these return signatures? |
| | 1087 | //return fbs.getWritten(); |
| 1086 | return buf[0..fbs.pos]; | 1088 | return buf[0..fbs.pos]; |
| 1087 | } | 1089 | } |
| 1088 | | 1090 | |
| ... | @@ -1195,18 +1197,15 @@ test "buffer" { | ... | @@ -1195,18 +1197,15 @@ test "buffer" { |
| 1195 | var buf1: [32]u8 = undefined; | 1197 | var buf1: [32]u8 = undefined; |
| 1196 | var fbs = std.io.fixedBufferStream(&buf1); | 1198 | var fbs = std.io.fixedBufferStream(&buf1); |
| 1197 | try formatType(1234, "", FormatOptions{}, fbs.outStream(), default_max_depth); | 1199 | try formatType(1234, "", FormatOptions{}, fbs.outStream(), default_max_depth); |
| 1198 | var res = buf1[0..fbs.pos]; | 1200 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "1234")); |
| 1199 | std.testing.expect(mem.eql(u8, res, "1234")); | | |
| 1200 | | 1201 | |
| 1201 | try fbs.seekTo(0); | 1202 | fbs.reset(); |
| 1202 | try formatType('a', "c", FormatOptions{}, fbs.outStream(), default_max_depth); | 1203 | try formatType('a', "c", FormatOptions{}, fbs.outStream(), default_max_depth); |
| 1203 | res = buf1[0..fbs.pos]; | 1204 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "a")); |
| 1204 | std.testing.expect(mem.eql(u8, res, "a")); | | |
| 1205 | | 1205 | |
| 1206 | try fbs.seekTo(0); | 1206 | fbs.reset(); |
| 1207 | try formatType(0b1100, "b", FormatOptions{}, fbs.outStream(), default_max_depth); | 1207 | try formatType(0b1100, "b", FormatOptions{}, fbs.outStream(), default_max_depth); |
| 1208 | res = buf1[0..fbs.pos]; | 1208 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "1100")); |
| 1209 | std.testing.expect(mem.eql(u8, res, "1100")); | | |
| 1210 | } | 1209 | } |
| 1211 | } | 1210 | } |
| 1212 | | 1211 | |
| ... | @@ -1583,78 +1582,73 @@ test "formatIntValue with comptime_int" { | ... | @@ -1583,78 +1582,73 @@ test "formatIntValue with comptime_int" { |
| 1583 | var buf: [20]u8 = undefined; | 1582 | var buf: [20]u8 = undefined; |
| 1584 | var fbs = std.io.fixedBufferStream(&buf); | 1583 | var fbs = std.io.fixedBufferStream(&buf); |
| 1585 | try formatIntValue(value, "", FormatOptions{}, fbs.outStream()); | 1584 | try formatIntValue(value, "", FormatOptions{}, fbs.outStream()); |
| 1586 | std.testing.expect(mem.eql(u8, buf[0..fbs.pos], "123456789123456789")); | 1585 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "123456789123456789")); |
| 1587 | } | 1586 | } |
| 1588 | | | |
| 1589 | // test "formatType max_depth" { | | |
| 1590 | // const Vec2 = struct { | | |
| 1591 | // const SelfType = @This(); | | |
| 1592 | // x: f32, | | |
| 1593 | // y: f32, | | |
| 1594 | | | |
| 1595 | // pub fn format( | | |
| 1596 | // self: SelfType, | | |
| 1597 | // comptime fmt: []const u8, | | |
| 1598 | // options: FormatOptions, | | |
| 1599 | // context: var, | | |
| 1600 | // comptime Errors: type, | | |
| 1601 | // comptime output: fn (@TypeOf(context), []const u8) !void, | | |
| 1602 | // ) !void { | | |
| 1603 | // if (fmt.len == 0) { | | |
| 1604 | // return std.fmtstream.format(out_stream, "({d:.3},{d:.3})", .{ self.x, self.y }); | | |
| 1605 | // } else { | | |
| 1606 | // @compileError("Unknown format string: '" ++ fmt ++ "'"); | | |
| 1607 | // } | | |
| 1608 | // } | | |
| 1609 | // }; | | |
| 1610 | // const E = enum { | | |
| 1611 | // One, | | |
| 1612 | // Two, | | |
| 1613 | // Three, | | |
| 1614 | // }; | | |
| 1615 | // const TU = union(enum) { | | |
| 1616 | // const SelfType = @This(); | | |
| 1617 | // float: f32, | | |
| 1618 | // int: u32, | | |
| 1619 | // ptr: ?*SelfType, | | |
| 1620 | // }; | | |
| 1621 | // const S = struct { | | |
| 1622 | // const SelfType = @This(); | | |
| 1623 | // a: ?*SelfType, | | |
| 1624 | // tu: TU, | | |
| 1625 | // e: E, | | |
| 1626 | // vec: Vec2, | | |
| 1627 | // }; | | |
| 1628 | | 1587 | |
| 1629 | // var inst = S{ | 1588 | test "formatType max_depth" { |
| 1630 | // .a = null, | 1589 | const Vec2 = struct { |
| 1631 | // .tu = TU{ .ptr = null }, | 1590 | const SelfType = @This(); |
| 1632 | // .e = E.Two, | 1591 | x: f32, |
| 1633 | // .vec = Vec2{ .x = 10.2, .y = 2.22 }, | 1592 | y: f32, |
| 1634 | // }; | 1593 | |
| 1635 | // inst.a = &inst; | 1594 | pub fn format( |
| 1636 | // inst.tu.ptr = &inst.tu; | 1595 | self: SelfType, |
| 1637 | | 1596 | comptime fmt: []const u8, |
| 1638 | // var buf0 = std.ArrayList(u8).init(std.testing.allocator); | 1597 | options: FormatOptions, |
| 1639 | // defer buf0.deinit(); | 1598 | out_stream: var, |
| 1640 | // try formatType(inst, "", FormatOptions{}, &buf0, @TypeOf(std.ArrayList(u8).appendSlice).ReturnType.ErrorSet, std.ArrayList(u8).appendSlice, 0); | 1599 | ) !void { |
| 1641 | // std.testing.expect(mem.eql(u8, buf0.toSlice(), "S{ ... }")); | 1600 | if (fmt.len == 0) { |
| 1642 | | 1601 | return std.fmtstream.format(out_stream, "({d:.3},{d:.3})", .{ self.x, self.y }); |
| 1643 | // var buf1 = std.ArrayList(u8).init(std.testing.allocator); | 1602 | } else { |
| 1644 | // defer buf1.deinit(); | 1603 | @compileError("Unknown format string: '" ++ fmt ++ "'"); |
| 1645 | // try formatType(inst, "", FormatOptions{}, &buf1, @TypeOf(std.ArrayList(u8).appendSlice).ReturnType.ErrorSet, std.ArrayList(u8).appendSlice, 1); | 1604 | } |
| 1646 | // std.testing.expect(mem.eql(u8, buf1.toSlice(), "S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }")); | 1605 | } |
| 1647 | | 1606 | }; |
| 1648 | // var buf2 = std.ArrayList(u8).init(std.testing.allocator); | 1607 | const E = enum { |
| 1649 | // defer buf2.deinit(); | 1608 | One, |
| 1650 | // try formatType(inst, "", FormatOptions{}, &buf2, @TypeOf(std.ArrayList(u8).appendSlice).ReturnType.ErrorSet, std.ArrayList(u8).appendSlice, 2); | 1609 | Two, |
| 1651 | // std.testing.expect(mem.eql(u8, buf2.toSlice(), "S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }")); | 1610 | Three, |
| 1652 | | 1611 | }; |
| 1653 | // var buf3 = std.ArrayList(u8).init(std.testing.allocator); | 1612 | const TU = union(enum) { |
| 1654 | // defer buf3.deinit(); | 1613 | const SelfType = @This(); |
| 1655 | // try formatType(inst, "", FormatOptions{}, &buf3, @TypeOf(std.ArrayList(u8).appendSlice).ReturnType.ErrorSet, std.ArrayList(u8).appendSlice, 3); | 1614 | float: f32, |
| 1656 | // std.testing.expect(mem.eql(u8, buf3.toSlice(), "S{ .a = S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ .ptr = TU{ ... } } }, .e = E.Two, .vec = (10.200,2.220) }")); | 1615 | int: u32, |
| 1657 | // } | 1616 | ptr: ?*SelfType, |
| | 1617 | }; |
| | 1618 | const S = struct { |
| | 1619 | const SelfType = @This(); |
| | 1620 | a: ?*SelfType, |
| | 1621 | tu: TU, |
| | 1622 | e: E, |
| | 1623 | vec: Vec2, |
| | 1624 | }; |
| | 1625 | |
| | 1626 | var inst = S{ |
| | 1627 | .a = null, |
| | 1628 | .tu = TU{ .ptr = null }, |
| | 1629 | .e = E.Two, |
| | 1630 | .vec = Vec2{ .x = 10.2, .y = 2.22 }, |
| | 1631 | }; |
| | 1632 | inst.a = &inst; |
| | 1633 | inst.tu.ptr = &inst.tu; |
| | 1634 | |
| | 1635 | var buf: [1000]u8 = undefined; |
| | 1636 | var fbs = std.io.fixedBufferStream(&buf); |
| | 1637 | try formatType(inst, "", FormatOptions{}, fbs.outStream(), 0); |
| | 1638 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "S{ ... }")); |
| | 1639 | |
| | 1640 | fbs.reset(); |
| | 1641 | try formatType(inst, "", FormatOptions{}, fbs.outStream(), 1); |
| | 1642 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }")); |
| | 1643 | |
| | 1644 | fbs.reset(); |
| | 1645 | try formatType(inst, "", FormatOptions{}, fbs.outStream(), 2); |
| | 1646 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }")); |
| | 1647 | |
| | 1648 | fbs.reset(); |
| | 1649 | try formatType(inst, "", FormatOptions{}, fbs.outStream(), 3); |
| | 1650 | std.testing.expect(mem.eql(u8, fbs.getWritten(), "S{ .a = S{ .a = S{ .a = S{ ... }, .tu = TU{ ... }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ ... } }, .e = E.Two, .vec = (10.200,2.220) }, .tu = TU{ .ptr = TU{ .ptr = TU{ ... } } }, .e = E.Two, .vec = (10.200,2.220) }")); |
| | 1651 | } |
| 1658 | | 1652 | |
| 1659 | test "positional" { | 1653 | test "positional" { |
| 1660 | try testFmt("2 1 0", "{2} {1} {0}", .{ @as(usize, 0), @as(usize, 1), @as(usize, 2) }); | 1654 | try testFmt("2 1 0", "{2} {1} {0}", .{ @as(usize, 0), @as(usize, 1), @as(usize, 2) }); |