diff --git a/lib/std/Io.zig b/lib/std/Io.zig index 131fd4aec2..416b3a2131 100644 --- a/lib/std/Io.zig +++ b/lib/std/Io.zig @@ -913,6 +913,7 @@ test { } const Io = @This(); +const fs = std.fs; pub const EventLoop = @import("Io/EventLoop.zig"); @@ -946,6 +947,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 {}; @@ -991,3 +998,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; +} diff --git a/lib/std/Thread/Pool.zig b/lib/std/Thread/Pool.zig index d2b28492c6..486d067330 100644 --- a/lib/std/Thread/Pool.zig +++ b/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); +}