fs.File and io.File

Ha! Now that’s horizontal-scrollbar-clear!

In this case, though there are some snippets in the release notes and elsewhere, I’d like critique on a couple of possible basic usage examples for reading a text file line-by-line assuming \n delimiters:

First, an allocator-less one that requires a big-enough buffer:

   const io = std.testing.io;
   var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
   defer file.close(io);
 
   var buf: [1024]u8 = undefined; // must be big enough for an entire line
   var reader: std.Io.File.Reader = file.reader(io, &buf);
   while(reader.interface.takeDelimiter('\n')) |line| {
      if (line) |l| { std.debug.print("line: {s}\n", .{l}); }
      else { break; }
   } else |err| return err;

Second, using Writer.Allocating:

   const io = std.testing.io;
   var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
   defer file.close(io);

   var gpa = std.heap.DebugAllocator(.{}){};
   defer _ = gpa.deinit();
   const alloc = gpa.allocator();

   var line = std.Io.Writer.Allocating.init(alloc);
   defer line.deinit();
   var buf: [1]u8 = undefined; // ridiculously small for illustration
   var reader: std.Io.File.Reader = file.reader(io, &buf);
   while(reader.interface.streamDelimiter(&line.writer, '\n')) |count| {
      _ = count;
      _ = reader.interface.toss(1);
      std.debug.print("line: {s}\n", .{line.written()});
      line.clearRetainingCapacity();
   } else |err| switch (err) {
      error.EndOfStream => {}, // while loop done
      error.WriteFailed, error.ReadFailed => |e| return e,
   }
   if (line.written().len > 0) {
      std.debug.print("tail: {s}\n", .{line.written()});
   }

Please criticize without reservation. I’m not suggesting it’s a model.