struct Discarding [src]

Fields

count: u64
writer: Writer

Members

Source

pub const Discarding = struct { count: u64, writer: Writer, pub fn init(buffer: []u8) Discarding { return .{ .count = 0, .writer = .{ .vtable = &.{ .drain = Discarding.drain, .sendFile = Discarding.sendFile, }, .buffer = buffer, }, }; } /// Includes buffered data (no need to flush). pub fn fullCount(d: *const Discarding) u64 { return d.count + d.writer.end; } pub fn drain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); const slice = data[0 .. data.len - 1]; const pattern = data[slice.len]; var written: usize = pattern.len * splat; for (slice) |bytes| written += bytes.len; d.count += w.end + written; w.end = 0; return written; } pub fn sendFile(w: *Writer, file_reader: *File.Reader, limit: Limit) FileError!usize { if (File.Handle == void) return error.Unimplemented; switch (builtin.zig_backend) { else => {}, .stage2_aarch64 => return error.Unimplemented, } const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); d.count += w.end; w.end = 0; if (limit == .nothing) return 0; if (file_reader.getSize()) |size| { const n = limit.minInt64(size - file_reader.pos); if (n == 0) return error.EndOfStream; file_reader.seekBy(@intCast(n)) catch return error.Unimplemented; w.end = 0; d.count += n; return n; } else |_| { // Error is observable on `file_reader` instance, and it is better to // treat the file as a pipe. return error.Unimplemented; } } }