diff --git a/AnyReadable.zig b/AnyReadable.zig index d7be8a84f3520f4cb5d34e6c02acfcb69af94845..9584c513a799f9f39a3a0a054ff8c5068584f733 100644 --- a/AnyReadable.zig +++ b/AnyReadable.zig @@ -24,6 +24,9 @@ pub const readAlloc = R.readAlloc; pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; +pub const readExpected = R.readExpected; +pub const skipBytes = R.skipBytes; +pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; pub const Error = ReadError; // std compat pub const ReadError = anyerror; diff --git a/buffered_reader.zig b/buffered_reader.zig index 70417d39422b509fdc314253f00ea57dbc2da07f..c03c30286f462dae7a867dc1ee258c4dceb8e62e 100644 --- a/buffered_reader.zig +++ b/buffered_reader.zig @@ -35,6 +35,9 @@ pub fn BufferedReader(comptime buffer_size: usize, comptime ReaderType: type) ty pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; + pub const readExpected = R.readExpected; + pub const skipBytes = R.skipBytes; + pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; pub const ReadError = ReaderType.ReadError; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/fixed_buffer_stream.zig b/fixed_buffer_stream.zig index 580a51e4a83627416a113744d53b874563408f2a..98459661f838640e8ad789ea03a272bd2458f383 100644 --- a/fixed_buffer_stream.zig +++ b/fixed_buffer_stream.zig @@ -44,6 +44,9 @@ pub fn FixedBufferStream(comptime Buffer: type) type { pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; + pub const readExpected = R.readExpected; + pub const skipBytes = R.skipBytes; + pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof; pub const ReadError = error{}; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/nio.zig b/nio.zig index 65c0906a9bf5a28af3c6eb63494a595ca103f817..88f9e5502ccb214cc524a021a795e7482680e180 100644 --- a/nio.zig +++ b/nio.zig @@ -194,6 +194,36 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { } return error.StreamTooLong; } + + pub fn readExpected(self: Self, expected: []const u8) !bool { + for (expected) |item| { + const actual = try readByte(self); + if (actual != item) { + return false; + } + } + return true; + } + + pub fn skipBytes(self: Self, num_bytes: u64, comptime options: struct { buf_size: usize = 512 }) anyerror!void { + var buf: [options.buf_size]u8 = undefined; + var remaining = num_bytes; + while (remaining > 0) { + const amt = @min(remaining, options.buf_size); + try readNoEof(self, buf[0..amt]); + remaining -= amt; + } + } + + pub fn skipUntilDelimiterOrEof(self: Self, delimiter: u8) anyerror!void { + while (true) { + const byte = self.readByte() catch |err| switch (err) { + error.EndOfStream => return, + else => |e| return e, + }; + if (byte == delimiter) return; + } + } }; }