Function discardDelimiterLimit [src]

Reads from the stream until specified byte is found, discarding all data, excluding the delimiter. Returns the number of bytes discarded. Succeeds if stream ends before delimiter found. End of stream can be detected by checking if the delimiter is buffered.

Prototype

pub fn discardDelimiterLimit(r: *Reader, delimiter: u8, limit: Limit) DiscardDelimiterLimitError!usize

Parameters

r: *Readerdelimiter: u8limit: Limit

Possible Errors

ReadFailed
StreamTooLong

The delimiter was not found within the limit.

Example

test discardDelimiterLimit { var r: Reader = .fixed("foob\nar"); try testing.expectError(error.StreamTooLong, r.discardDelimiterLimit('\n', .limited(4))); try testing.expectEqual(0, try r.discardDelimiterLimit('\n', .limited(2))); try testing.expectEqualStrings("\n", try r.take(1)); try testing.expectEqual(2, try r.discardDelimiterLimit('\n', .unlimited)); try testing.expectEqual(0, try r.discardDelimiterLimit('\n', .unlimited)); }

Source

pub fn discardDelimiterLimit(r: *Reader, delimiter: u8, limit: Limit) DiscardDelimiterLimitError!usize { var remaining = @intFromEnum(limit); while (remaining != 0) { const available = Limit.limited(remaining).slice(r.peekGreedy(1) catch |err| switch (err) { error.ReadFailed => return error.ReadFailed, error.EndOfStream => return @intFromEnum(limit) - remaining, }); if (std.mem.indexOfScalar(u8, available, delimiter)) |delimiter_index| { r.toss(delimiter_index); remaining -= delimiter_index; return @intFromEnum(limit) - remaining; } r.toss(available.len); remaining -= available.len; } return error.StreamTooLong; }