Function streamDelimiterLimit [src]

Appends to w contents by reading from the stream until delimiter is found. Does not write the delimiter itself. Does not discard the delimiter from the Reader. Returns number of bytes streamed, which may be zero. End of stream can be detected by checking if the next byte in the stream is the delimiter. Asserts buffer capacity of at least one. This function performs better with larger buffers.

Prototype

pub fn streamDelimiterLimit( r: *Reader, w: *Writer, delimiter: u8, limit: Limit, ) StreamDelimiterLimitError!usize

Parameters

r: *Readerw: *Writerdelimiter: u8limit: Limit

Possible Errors

ReadFailed
StreamTooLong

The delimiter was not found within the limit.

WriteFailed

Example

test streamDelimiterLimit { var out_buffer: [10]u8 = undefined; var r: Reader = .fixed("foo\nbars"); var w: Writer = .fixed(&out_buffer); try testing.expectError(error.StreamTooLong, r.streamDelimiterLimit(&w, '\n', .limited(2))); try testing.expectEqual(1, try r.streamDelimiterLimit(&w, '\n', .limited(3))); try testing.expectEqualStrings("\n", try r.take(1)); try testing.expectEqual(4, try r.streamDelimiterLimit(&w, '\n', .unlimited)); try testing.expectEqualStrings("foobars", w.buffered()); }

Source

pub fn streamDelimiterLimit( r: *Reader, w: *Writer, delimiter: u8, limit: Limit, ) StreamDelimiterLimitError!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| { try w.writeAll(available[0..delimiter_index]); r.toss(delimiter_index); remaining -= delimiter_index; return @intFromEnum(limit) - remaining; } try w.writeAll(available); r.toss(available.len); remaining -= available.len; } return error.StreamTooLong; }