-
Notifications
You must be signed in to change notification settings - Fork 2
/
multireader.go
68 lines (47 loc) · 1.15 KB
/
multireader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package misc
import (
"io"
"github.com/hashicorp/go-multierror"
)
type MultiCloser struct {
closers []io.Closer
}
func NewMultiCloser(closers []io.Closer) *MultiCloser {
return &MultiCloser{
closers: closers,
}
}
func (m *MultiCloser) Close() error {
var err error
for _, c := range m.closers {
if e := c.Close(); e != nil {
err = multierror.Append(err, e)
}
}
return err
}
func MultiReaderCreate(inReader io.Reader, outReadersCount int, errch chan error) []io.Reader {
// Compose readers for return
readers, writer, closer := getReaders(outReadersCount)
// Start writes
go func() {
// Copy input reader to all readers
_, err := io.Copy(writer, inReader)
closer.Close()
// Send error
errch <- err
}()
return readers
}
func getReaders(count int) ([]io.Reader, io.Writer, io.Closer) {
readers := make([]io.Reader, 0, count)
writers := make([]io.Writer, 0, count)
closers := make([]io.Closer, 0, count)
for i := 0; i < count; i++ {
r, w := io.Pipe()
readers = append(readers, r)
writers = append(writers, w)
closers = append(closers, w)
}
return readers, io.MultiWriter(writers...), NewMultiCloser(closers)
}