Commit 66b0f7e92b

Andrew Kelley <andrew@ziglang.org>
2025-03-29 02:23:49
start adding fs functions to std.Io
1 parent 08bb7c6
Changed files (2)
lib
std
lib/std/Thread/Pool.zig
@@ -315,6 +315,11 @@ pub fn io(pool: *Pool) std.Io {
         .vtable = &.{
             .@"async" = @"async",
             .@"await" = @"await",
+            .createFile = createFile,
+            .openFile = openFile,
+            .closeFile = closeFile,
+            .read = read,
+            .write = write,
         },
     };
 }
@@ -399,3 +404,28 @@ pub fn @"await"(userdata: ?*anyopaque, any_future: *std.Io.AnyFuture, result: []
     @memcpy(result, closure.resultPointer()[0..result.len]);
     thread_pool.allocator.free(base[0 .. closure.result_offset + result.len]);
 }
+
+pub fn createFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.CreateFlags) std.fs.File.OpenError!std.fs.File {
+    _ = userdata;
+    return dir.createFile(sub_path, flags);
+}
+
+pub fn openFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.OpenFlags) std.fs.File.OpenError!std.fs.File {
+    _ = userdata;
+    return dir.openFile(sub_path, flags);
+}
+
+pub fn closeFile(userdata: ?*anyopaque, file: std.fs.File) void {
+    _ = userdata;
+    return file.close();
+}
+
+pub fn read(userdata: ?*anyopaque, file: std.fs.File, buffer: []u8) std.fs.File.ReadError!usize {
+    _ = userdata;
+    return file.read(buffer);
+}
+
+pub fn write(userdata: ?*anyopaque, file: std.fs.File, buffer: []const u8) std.fs.File.WriteError!usize {
+    _ = userdata;
+    return file.write(buffer);
+}
lib/std/Io.zig
@@ -555,6 +555,7 @@ test {
 }
 
 const Io = @This();
+const fs = std.fs;
 
 pub const EventLoop = @import("Io/EventLoop.zig");
 
@@ -588,6 +589,12 @@ pub const VTable = struct {
         /// The length is equal to size in bytes of result type.
         result: []u8,
     ) void,
+
+    createFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File,
+    openFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File,
+    closeFile: *const fn (?*anyopaque, fs.File) void,
+    read: *const fn (?*anyopaque, file: fs.File, buffer: []u8) fs.File.ReadError!usize,
+    write: *const fn (?*anyopaque, file: fs.File, buffer: []const u8) fs.File.WriteError!usize,
 };
 
 pub const AnyFuture = opaque {};
@@ -633,3 +640,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret
     );
     return future;
 }
+
+pub fn openFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File {
+    return io.vtable.openFile(io.userdata, dir, sub_path, flags);
+}
+
+pub fn createFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File {
+    return io.vtable.createFile(io.userdata, dir, sub_path, flags);
+}
+
+pub fn closeFile(io: Io, file: fs.File) void {
+    return io.vtable.closeFile(io.userdata, file);
+}
+
+pub fn read(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
+    return io.vtable.read(io.userdata, file, buffer);
+}
+
+pub fn write(io: Io, file: fs.File, buffer: []const u8) fs.File.WriteError!usize {
+    return io.vtable.write(io.userdata, file, buffer);
+}
+
+pub fn writeAll(io: Io, file: fs.File, bytes: []const u8) fs.File.WriteError!void {
+    var index: usize = 0;
+    while (index < bytes.len) {
+        index += try io.write(file, bytes[index..]);
+    }
+}
+
+pub fn readAll(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
+    var index: usize = 0;
+    while (index != buffer.len) {
+        const amt = try io.read(file, buffer[index..]);
+        if (amt == 0) break;
+        index += amt;
+    }
+    return index;
+}