| ... | @@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited { | ... | @@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited { |
| 25 | }; | 25 | }; |
| 26 | } | 26 | } |
| 27 | | 27 | |
| 28 | fn stream(context: ?*anyopaque, w: *Writer, limit: Limit) Reader.StreamError!usize { | 28 | fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize { |
| 29 | const l: *Limited = @alignCast(@ptrCast(context)); | 29 | const l: *Limited = @fieldParentPtr("interface", r); |
| 30 | const combined_limit = limit.min(l.remaining); | 30 | const combined_limit = limit.min(l.remaining); |
| 31 | const n = try l.unlimited_reader.read(w, combined_limit); | 31 | const n = try l.unlimited.stream(w, combined_limit); |
| 32 | l.remaining = l.remaining.subtract(n).?; | 32 | l.remaining = l.remaining.subtract(n).?; |
| 33 | return n; | 33 | return n; |
| 34 | } | 34 | } |
| 35 | | 35 | |
| 36 | fn discard(context: ?*anyopaque, limit: Limit) Reader.Error!usize { | 36 | test stream { |
| 37 | const l: *Limited = @alignCast(@ptrCast(context)); | 37 | var orig_buf: [10]u8 = undefined; |
| | 38 | @memcpy(&orig_buf, "test bytes"); |
| | 39 | var fixed: std.Io.Reader = .fixed(&orig_buf); |
| | 40 | |
| | 41 | var limit_buf: [1]u8 = undefined; |
| | 42 | var limited: std.Io.Reader.Limited = .init(&fixed, @enumFromInt(4), &limit_buf); |
| | 43 | |
| | 44 | var result_buf: [10]u8 = undefined; |
| | 45 | var fixed_writer: std.Io.Writer = .fixed(&result_buf); |
| | 46 | const streamed = try limited.interface.stream(&fixed_writer, @enumFromInt(7)); |
| | 47 | |
| | 48 | try std.testing.expect(streamed == 4); |
| | 49 | try std.testing.expectEqualStrings("test", result_buf[0..streamed]); |
| | 50 | } |
| | 51 | |
| | 52 | fn discard(r: *Reader, limit: Limit) Reader.Error!usize { |
| | 53 | const l: *Limited = @fieldParentPtr("interface", r); |
| 38 | const combined_limit = limit.min(l.remaining); | 54 | const combined_limit = limit.min(l.remaining); |
| 39 | const n = try l.unlimited_reader.discard(combined_limit); | 55 | const n = try l.unlimited.discard(combined_limit); |
| 40 | l.remaining = l.remaining.subtract(n).?; | 56 | l.remaining = l.remaining.subtract(n).?; |
| 41 | return n; | 57 | return n; |
| 42 | } | 58 | } |