| ... | @@ -86,6 +86,35 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { | ... | @@ -86,6 +86,35 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { |
| 86 | try readAllArrayList(self, &array_list, max_size); | 86 | try readAllArrayList(self, &array_list, max_size); |
| 87 | return try array_list.toOwnedSlice(); | 87 | return try array_list.toOwnedSlice(); |
| 88 | } | 88 | } |
| | 89 | |
| | 90 | pub fn readArray(self: Self, comptime N: usize) ![N]u8 { |
| | 91 | var buffer: [N]u8 = undefined; |
| | 92 | if (try readAll(self, &buffer) != N) return error.EndOfStream; |
| | 93 | return buffer; |
| | 94 | } |
| | 95 | |
| | 96 | pub fn readByte(self: Self) !u8 { |
| | 97 | return (try readArray(self, 1))[0]; |
| | 98 | } |
| | 99 | |
| | 100 | pub fn readUntilDelimitersBuf(self: Self, buffer: []u8, needle: []const u8) ![]u8 { |
| | 101 | var real_len: usize = 0; |
| | 102 | for (0..buffer.len) |_| { |
| | 103 | buffer[real_len] = try readByte(self); |
| | 104 | real_len += 1; |
| | 105 | if (real_len < needle.len) continue; |
| | 106 | if (std.mem.endsWith(u8, buffer[0..real_len], needle)) return buffer[0 .. real_len - needle.len]; |
| | 107 | } |
| | 108 | return error.StreamTooLong; |
| | 109 | } |
| | 110 | |
| | 111 | pub fn readUntilDelimitersArrayList(self: Self, array_list: *std.ArrayList(u8), needle: []const u8, max_size: usize) !usize { |
| | 112 | for (0..max_size) |i| { |
| | 113 | try array_list.append(try readByte(self)); |
| | 114 | if (std.mem.endsWith(u8, array_list.items, needle)) return i + 1 - needle.len; |
| | 115 | } |
| | 116 | return error.StreamTooLong; |
| | 117 | } |
| 89 | }; | 118 | }; |
| 90 | } | 119 | } |
| 91 | | 120 | |