authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-03-28 18:23:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-20 10:38:38-07:00
logd4ff3745d51c49c8b0050476acb42d4167deaea1
treea6799d780a845a5e29c7437ed3fd94b726176725
parentdb499b82b5c0d44030eecd6e99fd4864f3baaa53

start adding fs functions to std.Io


2 files changed, 74 insertions(+), 0 deletions(-)

lib/std/Io.zig+44
......@@ -913,6 +913,7 @@ test {
913913}
914914
915915const Io = @This();
916const fs = std.fs;
916917
917918pub const EventLoop = @import("Io/EventLoop.zig");
918919
......@@ -946,6 +947,12 @@ pub const VTable = struct {
946947 /// The length is equal to size in bytes of result type.
947948 result: []u8,
948949 ) void,
950
951 createFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File,
952 openFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File,
953 closeFile: *const fn (?*anyopaque, fs.File) void,
954 read: *const fn (?*anyopaque, file: fs.File, buffer: []u8) fs.File.ReadError!usize,
955 write: *const fn (?*anyopaque, file: fs.File, buffer: []const u8) fs.File.WriteError!usize,
949956};
950957
951958pub const AnyFuture = opaque {};
......@@ -991,3 +998,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret
991998 );
992999 return future;
9931000}
1001
1002pub fn openFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File {
1003 return io.vtable.openFile(io.userdata, dir, sub_path, flags);
1004}
1005
1006pub fn createFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File {
1007 return io.vtable.createFile(io.userdata, dir, sub_path, flags);
1008}
1009
1010pub fn closeFile(io: Io, file: fs.File) void {
1011 return io.vtable.closeFile(io.userdata, file);
1012}
1013
1014pub fn read(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
1015 return io.vtable.read(io.userdata, file, buffer);
1016}
1017
1018pub fn write(io: Io, file: fs.File, buffer: []const u8) fs.File.WriteError!usize {
1019 return io.vtable.write(io.userdata, file, buffer);
1020}
1021
1022pub fn writeAll(io: Io, file: fs.File, bytes: []const u8) fs.File.WriteError!void {
1023 var index: usize = 0;
1024 while (index < bytes.len) {
1025 index += try io.write(file, bytes[index..]);
1026 }
1027}
1028
1029pub fn readAll(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
1030 var index: usize = 0;
1031 while (index != buffer.len) {
1032 const amt = try io.read(file, buffer[index..]);
1033 if (amt == 0) break;
1034 index += amt;
1035 }
1036 return index;
1037}
lib/std/Thread/Pool.zig+30
......@@ -315,6 +315,11 @@ pub fn io(pool: *Pool) std.Io {
315315 .vtable = &.{
316316 .@"async" = @"async",
317317 .@"await" = @"await",
318 .createFile = createFile,
319 .openFile = openFile,
320 .closeFile = closeFile,
321 .read = read,
322 .write = write,
318323 },
319324 };
320325}
......@@ -399,3 +404,28 @@ pub fn @"await"(userdata: ?*anyopaque, any_future: *std.Io.AnyFuture, result: []
399404 @memcpy(result, closure.resultPointer()[0..result.len]);
400405 thread_pool.allocator.free(base[0 .. closure.result_offset + result.len]);
401406}
407
408pub fn createFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.CreateFlags) std.fs.File.OpenError!std.fs.File {
409 _ = userdata;
410 return dir.createFile(sub_path, flags);
411}
412
413pub fn openFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.OpenFlags) std.fs.File.OpenError!std.fs.File {
414 _ = userdata;
415 return dir.openFile(sub_path, flags);
416}
417
418pub fn closeFile(userdata: ?*anyopaque, file: std.fs.File) void {
419 _ = userdata;
420 return file.close();
421}
422
423pub fn read(userdata: ?*anyopaque, file: std.fs.File, buffer: []u8) std.fs.File.ReadError!usize {
424 _ = userdata;
425 return file.read(buffer);
426}
427
428pub fn write(userdata: ?*anyopaque, file: std.fs.File, buffer: []const u8) std.fs.File.WriteError!usize {
429 _ = userdata;
430 return file.write(buffer);
431}