
ADD: * `iox` subpackage FIX: * `logging` now has a way to return logWritier directly * added significant `io.*` interface compat to logWriter -- allowing a `logging.Logger` to essentially be used for a large amount of io interaction in other libraries.
42 lines
1.0 KiB
Go
42 lines
1.0 KiB
Go
package iox
|
|
|
|
import (
|
|
`io`
|
|
)
|
|
|
|
/*
|
|
CopyBufN is a mix between io.CopyN and io.CopyBuffer.
|
|
|
|
Despite what the docs may suggest, io.CopyN does NOT *read* n bytes from src AND write n bytes to dst.
|
|
Instead, it always reads 32 KiB from src, and writes n bytes to dst.
|
|
|
|
There are, of course, cases where this is deadfully undesired.
|
|
|
|
One can, of course, use io.CopyBuffer, but this is a bit annoying since you then have to provide a buffer yourself.
|
|
|
|
This convenience-wraps io.CopyBuffer to have a similar signature to io.CopyN but properly uses n for both reading and writing.
|
|
*/
|
|
func CopyBufN(dst io.Writer, src io.Reader, n int64) (written int64, err error) {
|
|
|
|
var b []byte
|
|
|
|
if n <= 0 {
|
|
err = ErrBufTooSmall
|
|
return
|
|
}
|
|
|
|
b = make([]byte, n)
|
|
|
|
written, err = io.CopyBuffer(dst, src, b)
|
|
|
|
return
|
|
}
|
|
|
|
// CopyBufWith allows for specifying a buffer allocator function, otherwise acts as CopyBufN.
|
|
func CopyBufWith(dst io.Writer, src io.Reader, bufFunc func() (b []byte)) (written int64, err error) {
|
|
|
|
written, err = io.CopyBuffer(dst, src, bufFunc())
|
|
|
|
return
|
|
}
|