mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 00:34:01 +03:00
FILE / ScuroNeko/mtg
wrappers/buffered_reader.go
Исходный файл и его история в репозитории.
39 lines
734 B
Go
39 lines
734 B
Go
package wrappers
|
|
|
|
import "bytes"
|
|
|
|
type BufferedReader struct {
|
|
Buffer *bytes.Buffer
|
|
}
|
|
|
|
func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, error) {
|
|
if b.Buffer.Len() > 0 {
|
|
return b.flush(p)
|
|
}
|
|
if err := callback(); err != nil {
|
|
return 0, err
|
|
}
|
|
return b.flush(p)
|
|
}
|
|
|
|
func (b *BufferedReader) flush(p []byte) (int, error) {
|
|
sizeToRead := len(p)
|
|
if b.Buffer.Len() < sizeToRead {
|
|
sizeToRead = b.Buffer.Len()
|
|
}
|
|
|
|
data := b.Buffer.Bytes()
|
|
copy(p, data[:sizeToRead])
|
|
if sizeToRead == b.Buffer.Len() {
|
|
b.Buffer.Reset()
|
|
} else {
|
|
b.Buffer = bytes.NewBuffer(data[sizeToRead:])
|
|
}
|
|
|
|
return sizeToRead, nil
|
|
}
|
|
|
|
func NewBufferedReader() BufferedReader {
|
|
return BufferedReader{Buffer: &bytes.Buffer{}}
|
|
}
|