| ... | ... | @@ -1,6 +1,5 @@ |
| 1 | 1 | const std = @import("../std.zig"); |
| 2 | 2 | const io = std.io; |
| 3 | | const testing = std.testing; |
| 4 | 3 | |
| 5 | 4 | /// Takes a tuple of streams, and constructs a new stream that writes to all of them |
| 6 | 5 | pub fn MultiWriter(comptime Writers: type) type { |
| ... | ... | @@ -23,14 +22,8 @@ pub fn MultiWriter(comptime Writers: type) type { |
| 23 | 22 | } |
| 24 | 23 | |
| 25 | 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(); |
| 27 | | comptime var i = 0; |
| 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(); |
| 25 | inline for (self.streams) |stream| |
| 26 | try stream.writeAll(bytes); |
| 34 | 27 | return bytes.len; |
| 35 | 28 | } |
| 36 | 29 | }; |
| ... | ... | @@ -40,13 +33,21 @@ pub fn multiWriter(streams: anytype) MultiWriter(@TypeOf(streams)) { |
| 40 | 33 | return .{ .streams = streams }; |
| 41 | 34 | } |
| 42 | 35 | |
| 36 | const testing = std.testing; |
| 37 | |
| 43 | 38 | test "MultiWriter" { |
| 39 | var tmp = testing.tmpDir(.{}); |
| 40 | defer tmp.cleanup(); |
| 41 | var f = try tmp.dir.createFile("t.txt", .{}); |
| 42 | |
| 44 | 43 | var buf1: [255]u8 = undefined; |
| 45 | 44 | var fbs1 = io.fixedBufferStream(&buf1); |
| 46 | 45 | var buf2: [255]u8 = undefined; |
| 47 | | var fbs2 = io.fixedBufferStream(&buf2); |
| 48 | | var stream = multiWriter(.{ fbs1.writer(), fbs2.writer() }); |
| 46 | var stream = multiWriter(.{ fbs1.writer(), f.writer() }); |
| 47 | |
| 49 | 48 | try stream.writer().print("HI", .{}); |
| 49 | f.close(); |
| 50 | |
| 50 | 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 | } |