From b85800a14c8dd942da21ad8765cd9c991c57b770 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 8 Jun 2026 14:47:55 -0700 Subject: [PATCH] Readable: add pipeTo(writable) --- AnyReadable.zig | 1 + buffered_reader.zig | 1 + counting_reader.zig | 1 + fixed_buffer_stream.zig | 1 + limited_reader.zig | 1 + nio.zig | 9 +++++++++ 6 files changed, 14 insertions(+) diff --git a/AnyReadable.zig b/AnyReadable.zig index 59292f79b8774894af9843498c59e2c2f8e8536c..82270e877a7ddf241063b9223819d31cc7dd694a 100644 --- a/AnyReadable.zig +++ b/AnyReadable.zig @@ -29,6 +29,7 @@ pub const readExpected = R.readExpected; pub const readType = R.readType; pub const skipBytes = R.skipBytes; pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; +pub const pipeTo = R.pipeTo; pub const Error = ReadError; // std compat pub const ReadError = anyerror; diff --git a/buffered_reader.zig b/buffered_reader.zig index 8e09f7371edad597a02b9c41f70add6421675a99..64dcb3acf4723890e74972ee82b4321a03f19c4e 100644 --- a/buffered_reader.zig +++ b/buffered_reader.zig @@ -41,6 +41,7 @@ pub fn BufferedReader(comptime buffer_size: usize, comptime ReaderType: type) ty pub const readType = R.readType; pub const skipBytes = R.skipBytes; pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; + pub const pipeTo = R.pipeTo; pub const ReadError = extras.Pointee(ReaderType).ReadError; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/counting_reader.zig b/counting_reader.zig index 25be23d90c42736d01bebc5d69a08f277ae5151a..dcca9d3f60f5ef041932d9003eb01418c82015ef 100644 --- a/counting_reader.zig +++ b/counting_reader.zig @@ -44,6 +44,7 @@ pub fn CountingReader(ReaderType: type) type { pub const readType = R.readType; pub const skipBytes = R.skipBytes; pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; + pub const pipeTo = R.pipeTo; pub const ReadError = extras.Pointee(ReaderType).ReadError; diff --git a/fixed_buffer_stream.zig b/fixed_buffer_stream.zig index b6189287a6b1a852b898d4142d6eee234924f8a5..86a6425b9208e153750335bbbc41a805423f7e2d 100644 --- a/fixed_buffer_stream.zig +++ b/fixed_buffer_stream.zig @@ -49,6 +49,7 @@ pub fn FixedBufferStream(comptime Buffer: type) type { pub const readType = R.readType; pub const skipBytes = R.skipBytes; pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; + pub const pipeTo = R.pipeTo; pub const ReadError = error{}; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/limited_reader.zig b/limited_reader.zig index 829b683af5083f168a7c9ea59566c296d36e4b90..367f94360ba1907a3ea5c156b07245e70ec12057 100644 --- a/limited_reader.zig +++ b/limited_reader.zig @@ -44,6 +44,7 @@ pub fn LimitedReader(ReaderType: type) type { pub const readType = R.readType; pub const skipBytes = R.skipBytes; pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; + pub const pipeTo = R.pipeTo; pub const ReadError = extras.Pointee(ReaderType).ReadError; diff --git a/nio.zig b/nio.zig index 46f1afb6c87989b15598a808443130beef73f36d..7e29e05566d5cbb977ee78e1e8903854b51dcc0f 100644 --- a/nio.zig +++ b/nio.zig @@ -261,6 +261,15 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { if (byte == delimiter) return; } } + + pub fn pipeTo(self: Self, writer: anytype) !void { + var buf: [4096]u8 = undefined; + while (true) { + const n = try self.read(&buf); + if (n == 0) break; + try writer.writeAll(buf[0..n]); + } + } }; } -- 2.54.0