authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 15:56:53 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 15:56:53 -07:00
logf799e3606855e2abffe68506759b5924442b1071
tree5d8edac4029990b1811dbaef9dceae31f656b4a7
parent96bbe3de7dd43e3d4f7e6aaaa34697f5f3f61190
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

AnyWritable: add toStd


1 files changed, 40 insertions(+), 0 deletions(-)

AnyWritable.zig+40
...@@ -54,3 +54,43 @@ pub fn fromStd(writer_ptr: *std.Io.Writer) AnyWritable {...@@ -54,3 +54,43 @@ pub fn fromStd(writer_ptr: *std.Io.Writer) AnyWritable {
54 .state = @ptrCast(@constCast(writer_ptr)),54 .state = @ptrCast(@constCast(writer_ptr)),
55 };55 };
56}56}
57
58pub fn toStd(r: AnyWritable, buf: []u8) StdWriter {
59 const S = struct {
60 fn drain(sw: *std.Io.Writer, data: []const []const u8, splat: usize) error{WriteFailed}!usize {
61 const w: *StdWriter = @alignCast(@fieldParentPtr("sw", sw));
62 while (true) {
63 const rem = w.sw.buffered();
64 const n = w.aw.write(rem) catch return error.WriteFailed;
65 const l = w.sw.consume(n);
66 if (l == 0) break;
67 }
68 var n: usize = 0;
69 const slice = data[0 .. data.len - 1];
70 w.aw.writevAll(slice) catch return error.WriteFailed;
71 for (slice) |x| n += x.len;
72 const pattern = data[slice.len];
73 w.aw.writeNTimes(pattern, splat) catch return error.WriteFailed;
74 n += pattern.len * splat;
75 return n;
76 }
77 fn flush(sw: *std.Io.Writer) error{WriteFailed}!void {
78 const w: *StdWriter = @alignCast(@fieldParentPtr("sw", sw));
79 return w.aw.writeAll(w.sw.buffered()) catch return error.WriteFailed;
80 }
81 };
82 return .{
83 .aw = r,
84 .sw = .{
85 .vtable = &.{
86 .drain = S.drain,
87 .flush = S.flush,
88 },
89 .buffer = buf,
90 },
91 };
92}
93const StdWriter = struct {
94 aw: AnyWritable,
95 sw: std.Io.Writer,
96};