start adding fs functions to std.Io

This commit is contained in:
Andrew Kelley 2025-03-28 18:23:49 -07:00
parent db499b82b5
commit d4ff3745d5
2 changed files with 74 additions and 0 deletions

View File

@ -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;
}

View File

@ -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);
}