mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-05-28 13:18:11 +00:00
bcb80d3ff4
* [chore] bump gruf/go-store to v2 * no more boobs
97 lines
2.2 KiB
Go
97 lines
2.2 KiB
Go
package util
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
// ReaderSize ...
|
|
type ReaderSize interface {
|
|
io.Reader
|
|
|
|
// Size ...
|
|
Size() int64
|
|
}
|
|
|
|
// ByteReaderSize ...
|
|
type ByteReaderSize struct {
|
|
bytes.Reader
|
|
sz int64
|
|
}
|
|
|
|
// NewByteReaderSize ...
|
|
func NewByteReaderSize(b []byte) *ByteReaderSize {
|
|
rs := ByteReaderSize{}
|
|
rs.Reset(b)
|
|
return &rs
|
|
}
|
|
|
|
// Size implements ReaderSize.Size().
|
|
func (rs ByteReaderSize) Size() int64 {
|
|
return rs.sz
|
|
}
|
|
|
|
// Reset resets the ReaderSize to be reading from b.
|
|
func (rs *ByteReaderSize) Reset(b []byte) {
|
|
rs.Reader.Reset(b)
|
|
rs.sz = int64(len(b))
|
|
}
|
|
|
|
// NopReadCloser turns a supplied io.Reader into io.ReadCloser with a nop Close() implementation.
|
|
func NopReadCloser(r io.Reader) io.ReadCloser {
|
|
return &nopReadCloser{r}
|
|
}
|
|
|
|
// NopWriteCloser turns a supplied io.Writer into io.WriteCloser with a nop Close() implementation.
|
|
func NopWriteCloser(w io.Writer) io.WriteCloser {
|
|
return &nopWriteCloser{w}
|
|
}
|
|
|
|
// ReadCloserWithCallback adds a customizable callback to be called upon Close() of a supplied io.ReadCloser.
|
|
func ReadCloserWithCallback(rc io.ReadCloser, cb func()) io.ReadCloser {
|
|
return &callbackReadCloser{
|
|
ReadCloser: rc,
|
|
callback: cb,
|
|
}
|
|
}
|
|
|
|
// WriteCloserWithCallback adds a customizable callback to be called upon Close() of a supplied io.WriteCloser.
|
|
func WriteCloserWithCallback(wc io.WriteCloser, cb func()) io.WriteCloser {
|
|
return &callbackWriteCloser{
|
|
WriteCloser: wc,
|
|
callback: cb,
|
|
}
|
|
}
|
|
|
|
// nopReadCloser turns an io.Reader -> io.ReadCloser with a nop Close().
|
|
type nopReadCloser struct{ io.Reader }
|
|
|
|
func (r *nopReadCloser) Close() error { return nil }
|
|
|
|
// nopWriteCloser turns an io.Writer -> io.WriteCloser with a nop Close().
|
|
type nopWriteCloser struct{ io.Writer }
|
|
|
|
func (w nopWriteCloser) Close() error { return nil }
|
|
|
|
// callbackReadCloser allows adding our own custom callback to an io.ReadCloser.
|
|
type callbackReadCloser struct {
|
|
io.ReadCloser
|
|
callback func()
|
|
}
|
|
|
|
func (c *callbackReadCloser) Close() error {
|
|
defer c.callback()
|
|
return c.ReadCloser.Close()
|
|
}
|
|
|
|
// callbackWriteCloser allows adding our own custom callback to an io.WriteCloser.
|
|
type callbackWriteCloser struct {
|
|
io.WriteCloser
|
|
callback func()
|
|
}
|
|
|
|
func (c *callbackWriteCloser) Close() error {
|
|
defer c.callback()
|
|
return c.WriteCloser.Close()
|
|
}
|