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-10-02 16:30:59-07:00
logbe68b28b9b9114611e72a86f0ceee3d8c277ee20
tree6642ab27e093193325d43e5e783946d41b3f8964
parent5be0d0b48c7baef48b6771074156ba2327ee4fad

start adding fs functions to std.Io


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

lib/std/Io.zig+44
......@@ -555,6 +555,7 @@ test {
555555}
556556
557557const Io = @This();
558const fs = std.fs;
558559
559560pub const EventLoop = @import("Io/EventLoop.zig");
560561
......@@ -588,6 +589,12 @@ pub const VTable = struct {
588589 /// The length is equal to size in bytes of result type.
589590 result: []u8,
590591 ) void,
592
593 createFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File,
594 openFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File,
595 closeFile: *const fn (?*anyopaque, fs.File) void,
596 read: *const fn (?*anyopaque, file: fs.File, buffer: []u8) fs.File.ReadError!usize,
597 write: *const fn (?*anyopaque, file: fs.File, buffer: []const u8) fs.File.WriteError!usize,
591598};
592599
593600pub const AnyFuture = opaque {};
......@@ -633,3 +640,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret
633640 );
634641 return future;
635642}
643
644pub fn openFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File {
645 return io.vtable.openFile(io.userdata, dir, sub_path, flags);
646}
647
648pub fn createFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File {
649 return io.vtable.createFile(io.userdata, dir, sub_path, flags);
650}
651
652pub fn closeFile(io: Io, file: fs.File) void {
653 return io.vtable.closeFile(io.userdata, file);
654}
655
656pub fn read(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
657 return io.vtable.read(io.userdata, file, buffer);
658}
659
660pub fn write(io: Io, file: fs.File, buffer: []const u8) fs.File.WriteError!usize {
661 return io.vtable.write(io.userdata, file, buffer);
662}
663
664pub fn writeAll(io: Io, file: fs.File, bytes: []const u8) fs.File.WriteError!void {
665 var index: usize = 0;
666 while (index < bytes.len) {
667 index += try io.write(file, bytes[index..]);
668 }
669}
670
671pub fn readAll(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
672 var index: usize = 0;
673 while (index != buffer.len) {
674 const amt = try io.read(file, buffer[index..]);
675 if (amt == 0) break;
676 index += amt;
677 }
678 return index;
679}
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}