aboutsummaryrefslogtreecommitdiff
path: root/src/stream
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-17 13:09:02 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-17 13:09:02 +0100
commit6201307fecf8398a1b53bf276bc08bfbb3524899 (patch)
tree2e623f4779b310a81b49dbb146146f8a694d9ec8 /src/stream
parent9c979a6fefdfc6709b3576014520d219e02c3649 (diff)
implement memora.Stream
Diffstat (limited to 'src/stream')
-rw-r--r--src/stream/buffer.zig28
-rw-r--r--src/stream/file.zig22
-rw-r--r--src/stream/root.zig33
3 files changed, 83 insertions, 0 deletions
diff --git a/src/stream/buffer.zig b/src/stream/buffer.zig
new file mode 100644
index 0000000..fca1deb
--- /dev/null
+++ b/src/stream/buffer.zig
@@ -0,0 +1,28 @@
+const std = @import("std");
+
+const Self = @This();
+
+buffer: []const u8,
+buffer_reader: ?std.Io.Reader,
+
+pub fn init(buffer: []const u8) Self {
+ return .{
+ .buffer = buffer,
+ .buffer_reader = null,
+ };
+}
+
+pub fn reader(self: *Self, buffer: []u8) *std.Io.Reader {
+ _ = buffer;
+
+ if (self.buffer_reader) |*r| {
+ return r;
+ }
+
+ self.buffer_reader = std.Io.Reader.fixed(self.buffer);
+ return &self.buffer_reader.?;
+}
+
+pub fn close(self: *Self) void {
+ _ = self;
+}
diff --git a/src/stream/file.zig b/src/stream/file.zig
new file mode 100644
index 0000000..bb6407b
--- /dev/null
+++ b/src/stream/file.zig
@@ -0,0 +1,22 @@
+const std = @import("std");
+
+const Self = @This();
+
+file: std.fs.File,
+file_reader: ?std.fs.File.Reader,
+
+pub fn init(file: std.fs.File) Self {
+ return .{
+ .file = file,
+ .file_reader = null,
+ };
+}
+
+pub fn reader(self: *Self, buffer: []u8) *std.Io.Reader {
+ self.file_reader = self.file.reader(buffer);
+ return &self.file_reader.?.interface;
+}
+
+pub fn close(self: *Self) void {
+ self.file.close();
+}
diff --git a/src/stream/root.zig b/src/stream/root.zig
new file mode 100644
index 0000000..11580ac
--- /dev/null
+++ b/src/stream/root.zig
@@ -0,0 +1,33 @@
+const std = @import("std");
+
+pub const Stream = union(enum) {
+ const Self = @This();
+
+ pub const File = @import("file.zig");
+ pub const Buffer = @import("buffer.zig");
+
+ file: File,
+ buffer: Buffer,
+
+ pub fn from_file(file: std.fs.File) Self {
+ return .{ .file = File.init(file) };
+ }
+
+ pub fn from_buffer(buffer: []const u8) Self {
+ return .{ .buffer = Buffer.init(buffer) };
+ }
+
+ pub fn reader(self: *Self, buffer: []u8) *std.Io.Reader {
+ return switch(self.*) {
+ .file => |*f| f.reader(buffer),
+ .buffer => |*b| b.reader(buffer),
+ };
+ }
+
+ pub fn close(self: *Self) void {
+ return switch(self.*) {
+ .file => |*f| f.close(),
+ .buffer => |*b| b.close(),
+ };
+ }
+};