|
const std = @import("../std.zig"); const io = std.io; |
MultiWriter()Takes a tuple of streams, and constructs a new stream that writes to all of them |
pub fn MultiWriter(comptime Writers: type) type { comptime var ErrSet = error{}; inline for (@typeInfo(Writers).Struct.fields) |field| { const StreamType = field.type; ErrSet = ErrSet || StreamType.Error; } return struct { const Self = @This(); streams: Writers, pub const Error = ErrSet; pub const Writer = io.Writer(*Self, Error, write); |
writer() |
pub fn writer(self: *Self) Writer { return .{ .context = self }; } |
write() |
pub fn write(self: *Self, bytes: []const u8) Error!usize { inline for (self.streams) |stream| try stream.writeAll(bytes); return bytes.len; } }; } |
multiWriter() |
pub fn multiWriter(streams: anytype) MultiWriter(@TypeOf(streams)) { return .{ .streams = streams }; } const testing = std.testing; |
Test:MultiWriter |
test "MultiWriter" { var tmp = testing.tmpDir(.{}); defer tmp.cleanup(); var f = try tmp.dir.createFile("t.txt", .{}); var buf1: [255]u8 = undefined; var fbs1 = io.fixedBufferStream(&buf1); var buf2: [255]u8 = undefined; var stream = multiWriter(.{ fbs1.writer(), f.writer() }); try stream.writer().print("HI", .{}); f.close(); try testing.expectEqualSlices(u8, "HI", fbs1.getWritten()); try testing.expectEqualSlices(u8, "HI", try tmp.dir.readFile("t.txt", &buf2)); } |
Generated by zstd-browse2 on 2023-11-04 14:12:29 -0400. |