From f799e3606855e2abffe68506759b5924442b1071 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Thu, 25 Jun 2026 15:56:53 -0700 Subject: [PATCH] AnyWritable: add toStd --- AnyWritable.zig | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/AnyWritable.zig b/AnyWritable.zig index 66fcbb11603f375c0b0c6f6ab5ed8e1fdc3ea388..c3d44d973fd904752011ae8a2470838f434acbd7 100644 --- a/AnyWritable.zig +++ b/AnyWritable.zig @@ -54,3 +54,43 @@ pub fn fromStd(writer_ptr: *std.Io.Writer) AnyWritable { .state = @ptrCast(@constCast(writer_ptr)), }; } + +pub fn toStd(r: AnyWritable, buf: []u8) StdWriter { + const S = struct { + fn drain(sw: *std.Io.Writer, data: []const []const u8, splat: usize) error{WriteFailed}!usize { + const w: *StdWriter = @alignCast(@fieldParentPtr("sw", sw)); + while (true) { + const rem = w.sw.buffered(); + const n = w.aw.write(rem) catch return error.WriteFailed; + const l = w.sw.consume(n); + if (l == 0) break; + } + var n: usize = 0; + const slice = data[0 .. data.len - 1]; + w.aw.writevAll(slice) catch return error.WriteFailed; + for (slice) |x| n += x.len; + const pattern = data[slice.len]; + w.aw.writeNTimes(pattern, splat) catch return error.WriteFailed; + n += pattern.len * splat; + return n; + } + fn flush(sw: *std.Io.Writer) error{WriteFailed}!void { + const w: *StdWriter = @alignCast(@fieldParentPtr("sw", sw)); + return w.aw.writeAll(w.sw.buffered()) catch return error.WriteFailed; + } + }; + return .{ + .aw = r, + .sw = .{ + .vtable = &.{ + .drain = S.drain, + .flush = S.flush, + }, + .buffer = buf, + }, + }; +} +const StdWriter = struct { + aw: AnyWritable, + sw: std.Io.Writer, +}; -- 2.54.0