git-lfs/tools/sync_writer.go

52 lines
1.1 KiB
Go
Raw Normal View History

package tools
import "io"
// closeFn is the type of func Close() in the io.Closer interface.
type closeFn func() error
// syncFn is the type of func Sync() in the *os.File implementation.
type syncFn func() error
// SyncWriter provides a wrapper around an io.Writer that synchronizes all
// write after they occur, if the underlying writer supports synchronization.
type SyncWriter struct {
w io.Writer
closeFn closeFn
syncFn syncFn
}
// NewSyncWriter returns a new instance of the *SyncWriter that sends all writes
// to the given io.Writer.
func NewSyncWriter(w io.Writer) *SyncWriter {
sw := &SyncWriter{
w: w,
}
if sync, ok := w.(interface {
Sync() error
}); ok {
sw.syncFn = sync.Sync
}
if close, ok := w.(io.Closer); ok {
sw.closeFn = close.Close
}
return sw
}
// Write will write to the file and perform a Sync() if writing succeeds.
func (w *SyncWriter) Write(b []byte) error {
if _, err := w.w.Write(b); err != nil {
return err
}
return w.syncFn()
}
// Close will call Close() on the underlying file
func (w *SyncWriter) Close() error {
return w.closeFn()
}