forked from NYANDEV/forgejo
42 lines
687 B
Go
42 lines
687 B
Go
|
package buffer
|
||
|
|
||
|
import (
|
||
|
"encoding/gob"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"math"
|
||
|
)
|
||
|
|
||
|
type spill struct {
|
||
|
Buffer
|
||
|
Spiller io.Writer
|
||
|
}
|
||
|
|
||
|
// NewSpill returns a Buffer which writes data to w when there's an error
|
||
|
// writing to buf. Such as when buf is full, or the disk is full, etc.
|
||
|
func NewSpill(buf Buffer, w io.Writer) Buffer {
|
||
|
if w == nil {
|
||
|
w = ioutil.Discard
|
||
|
}
|
||
|
return &spill{
|
||
|
Buffer: buf,
|
||
|
Spiller: w,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (buf *spill) Cap() int64 {
|
||
|
return math.MaxInt64
|
||
|
}
|
||
|
|
||
|
func (buf *spill) Write(p []byte) (n int, err error) {
|
||
|
if n, err = buf.Buffer.Write(p); err != nil {
|
||
|
m, err := buf.Spiller.Write(p[n:])
|
||
|
return m + n, err
|
||
|
}
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
gob.Register(&spill{})
|
||
|
}
|