mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
This commit is non-breaking. std.io is deprecated in favor of std.Io, in preparation for that namespace becoming an interface.
42 lines
1.2 KiB
Zig
42 lines
1.2 KiB
Zig
const Limited = @This();
|
|
|
|
const std = @import("../../std.zig");
|
|
const Reader = std.io.Reader;
|
|
const Writer = std.io.Writer;
|
|
const Limit = std.io.Limit;
|
|
|
|
unlimited: *Reader,
|
|
remaining: Limit,
|
|
interface: Reader,
|
|
|
|
pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
|
|
return .{
|
|
.unlimited = reader,
|
|
.remaining = limit,
|
|
.interface = .{
|
|
.vtable = &.{
|
|
.stream = stream,
|
|
.discard = discard,
|
|
},
|
|
.buffer = buffer,
|
|
.seek = 0,
|
|
.end = 0,
|
|
},
|
|
};
|
|
}
|
|
|
|
fn stream(context: ?*anyopaque, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
|
const l: *Limited = @alignCast(@ptrCast(context));
|
|
const combined_limit = limit.min(l.remaining);
|
|
const n = try l.unlimited_reader.read(w, combined_limit);
|
|
l.remaining = l.remaining.subtract(n).?;
|
|
return n;
|
|
}
|
|
|
|
fn discard(context: ?*anyopaque, limit: Limit) Reader.Error!usize {
|
|
const l: *Limited = @alignCast(@ptrCast(context));
|
|
const combined_limit = limit.min(l.remaining);
|
|
const n = try l.unlimited_reader.discard(combined_limit);
|
|
l.remaining = l.remaining.subtract(n).?;
|
|
return n;
|
|
}
|