| ... | @@ -1,6 +1,5 @@ | ... | @@ -1,6 +1,5 @@ |
| 1 | const std = @import("../std.zig"); | 1 | const std = @import("../std.zig"); |
| 2 | const io = std.io; | 2 | const io = std.io; |
| 3 | const testing = std.testing; | | |
| 4 | | 3 | |
| 5 | /// Takes a tuple of streams, and constructs a new stream that writes to all of them | 4 | /// Takes a tuple of streams, and constructs a new stream that writes to all of them |
| 6 | pub fn MultiWriter(comptime Writers: type) type { | 5 | pub fn MultiWriter(comptime Writers: type) type { |
| ... | @@ -23,14 +22,8 @@ pub fn MultiWriter(comptime Writers: type) type { | ... | @@ -23,14 +22,8 @@ pub fn MultiWriter(comptime Writers: type) type { |
| 23 | } | 22 | } |
| 24 | | 23 | |
| 25 | pub fn write(self: *Self, bytes: []const u8) Error!usize { | 24 | pub fn write(self: *Self, bytes: []const u8) Error!usize { |
| 26 | var batch = std.event.Batch(Error!void, self.streams.len, .auto_async).init(); | 25 | inline for (self.streams) |stream| |
| 27 | comptime var i = 0; | 26 | try stream.writeAll(bytes); |
| 28 | inline while (i < self.streams.len) : (i += 1) { | | |
| 29 | const stream = self.streams[i]; | | |
| 30 | // TODO: remove ptrCast: https://github.com/ziglang/zig/issues/5258 | | |
| 31 | batch.add(@ptrCast(anyframe->Error!void, &async stream.writeAll(bytes))); | | |
| 32 | } | | |
| 33 | try batch.wait(); | | |
| 34 | return bytes.len; | 27 | return bytes.len; |
| 35 | } | 28 | } |
| 36 | }; | 29 | }; |
| ... | @@ -40,13 +33,21 @@ pub fn multiWriter(streams: anytype) MultiWriter(@TypeOf(streams)) { | ... | @@ -40,13 +33,21 @@ pub fn multiWriter(streams: anytype) MultiWriter(@TypeOf(streams)) { |
| 40 | return .{ .streams = streams }; | 33 | return .{ .streams = streams }; |
| 41 | } | 34 | } |
| 42 | | 35 | |
| | 36 | const testing = std.testing; |
| | 37 | |
| 43 | test "MultiWriter" { | 38 | test "MultiWriter" { |
| | 39 | var tmp = testing.tmpDir(.{}); |
| | 40 | defer tmp.cleanup(); |
| | 41 | var f = try tmp.dir.createFile("t.txt", .{}); |
| | 42 | |
| 44 | var buf1: [255]u8 = undefined; | 43 | var buf1: [255]u8 = undefined; |
| 45 | var fbs1 = io.fixedBufferStream(&buf1); | 44 | var fbs1 = io.fixedBufferStream(&buf1); |
| 46 | var buf2: [255]u8 = undefined; | 45 | var buf2: [255]u8 = undefined; |
| 47 | var fbs2 = io.fixedBufferStream(&buf2); | 46 | var stream = multiWriter(.{ fbs1.writer(), f.writer() }); |
| 48 | var stream = multiWriter(.{ fbs1.writer(), fbs2.writer() }); | 47 | |
| 49 | try stream.writer().print("HI", .{}); | 48 | try stream.writer().print("HI", .{}); |
| | 49 | f.close(); |
| | 50 | |
| 50 | try testing.expectEqualSlices(u8, "HI", fbs1.getWritten()); | 51 | try testing.expectEqualSlices(u8, "HI", fbs1.getWritten()); |
| 51 | try testing.expectEqualSlices(u8, "HI", fbs2.getWritten()); | 52 | try testing.expectEqualSlices(u8, "HI", try tmp.dir.readFile("t.txt", &buf2)); |
| 52 | } | 53 | } |