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 {...@@ -913,6 +913,7 @@ test {
913}913}
914914
915const Io = @This();915const Io = @This();
916const fs = std.fs;
916917
917pub const EventLoop = @import("Io/EventLoop.zig");918pub const EventLoop = @import("Io/EventLoop.zig");
918919
...@@ -946,6 +947,12 @@ pub const VTable = struct {...@@ -946,6 +947,12 @@ pub const VTable = struct {
946 /// The length is equal to size in bytes of result type.947 /// The length is equal to size in bytes of result type.
947 result: []u8,948 result: []u8,
948 ) void,949 ) 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,
949};956};
950957
951pub const AnyFuture = opaque {};958pub const AnyFuture = opaque {};
...@@ -991,3 +998,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret...@@ -991,3 +998,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret
991 );998 );
992 return future;999 return future;
993}1000}
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 {...@@ -315,6 +315,11 @@ pub fn io(pool: *Pool) std.Io {
315 .vtable = &.{315 .vtable = &.{
316 .@"async" = @"async",316 .@"async" = @"async",
317 .@"await" = @"await",317 .@"await" = @"await",
318 .createFile = createFile,
319 .openFile = openFile,
320 .closeFile = closeFile,
321 .read = read,
322 .write = write,
318 },323 },
319 };324 };
320}325}
...@@ -399,3 +404,28 @@ pub fn @"await"(userdata: ?*anyopaque, any_future: *std.Io.AnyFuture, result: []...@@ -399,3 +404,28 @@ pub fn @"await"(userdata: ?*anyopaque, any_future: *std.Io.AnyFuture, result: []
399 @memcpy(result, closure.resultPointer()[0..result.len]);404 @memcpy(result, closure.resultPointer()[0..result.len]);
400 thread_pool.allocator.free(base[0 .. closure.result_offset + result.len]);405 thread_pool.allocator.free(base[0 .. closure.result_offset + result.len]);
401}406}
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}