Files
c3c/lib/std/io/stream/limitreader.c3
Christoffer Lerno cdabe8fd9e - Create optional with ~ instead of ?. return io::EOF?; becomes return io::EOF~.
- Deprecated use of `?` to create optional.
2026-01-20 16:10:28 +01:00

44 lines
918 B
Plaintext

module std::io;
struct LimitReader (InStream)
{
InStream wrapped_stream;
usz limit;
}
<*
@param [&inout] wrapped_stream : "The stream to read from"
@param limit : "The max limit to read"
*>
fn LimitReader* LimitReader.init(&self, InStream wrapped_stream, usz limit)
{
*self = { .wrapped_stream = wrapped_stream, .limit = limit };
return self;
}
fn void? LimitReader.close(&self) @dynamic
{
if (&self.wrapped_stream.close) return self.wrapped_stream.close();
}
fn usz? LimitReader.read(&self, char[] bytes) @dynamic
{
if (self.limit == 0) return io::EOF~;
usz m = min(bytes.len, self.limit);
usz n = self.wrapped_stream.read(bytes[:m])!;
self.limit -= n;
return n;
}
fn char? LimitReader.read_byte(&self) @dynamic
{
if (self.limit == 0) return io::EOF~;
defer try self.limit--;
return self.wrapped_stream.read_byte();
}
fn usz? LimitReader.available(&self) @inline @dynamic
{
return self.limit;
}