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, 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 /// Number of slices to store on the stack, when trying to send as many byte
/// vectors through the underlying write calls as possible. /// vectors through the underlying write calls as possible.
@ -1572,7 +1572,7 @@ pub const Writer = struct {
.mode = w.mode, .mode = w.mode,
.pos = w.pos, .pos = w.pos,
.interface = Reader.initInterface(w.interface.buffer), .interface = Reader.initInterface(w.interface.buffer),
.seek_err = null, .seek_err = w.seek_err,
}; };
} }
@ -2002,8 +2002,14 @@ pub const Writer = struct {
return n; 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 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) { switch (w.mode) {
.positional, .positional_reading => { .positional, .positional_reading => {
w.pos = offset; w.pos = offset;