std.fs.File.Writer: break up seekTo

- introduce seekToUnbuffered which asserts no buffered data and does not
  have WriteFailed in the error set
- remove WriteFailed from SeekError
- make seekTo based on calling flush and then seekToUnbuffered
- revert the change to reset seek_err since the error sets are
  compatible again
This commit is contained in:
Andrew Kelley 2025-09-04 11:13:08 -07:00
parent d94e061ade
commit f78f70dbd8

View File

@ -1527,7 +1527,7 @@ pub const Writer = struct {
Unexpected,
};
pub const SeekError = File.SeekError || std.Io.Writer.Error;
pub const SeekError = File.SeekError;
/// Number of slices to store on the stack, when trying to send as many byte
/// vectors through the underlying write calls as possible.
@ -1572,7 +1572,7 @@ pub const Writer = struct {
.mode = w.mode,
.pos = w.pos,
.interface = Reader.initInterface(w.interface.buffer),
.seek_err = null,
.seek_err = w.seek_err,
};
}
@ -2002,8 +2002,14 @@ pub const Writer = struct {
return n;
}
pub fn seekTo(w: *Writer, offset: u64) Writer.SeekError!void {
pub fn seekTo(w: *Writer, offset: u64) (Writer.SeekError || std.Io.Writer.Error)!void {
try w.interface.flush();
try seekToUnbuffered(w, offset);
}
/// Asserts that no data is currently buffered.
pub fn seekToUnbuffered(w: *Writer, offset: u64) Writer.SeekError!void {
assert(w.interface.buffered().len == 0);
switch (w.mode) {
.positional, .positional_reading => {
w.pos = offset;