multi.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2010 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package io
  5. type multiReader struct {
  6. readers []Reader
  7. }
  8. func (mr *multiReader) Read(p []byte) (n int, err error) {
  9. for len(mr.readers) > 0 {
  10. n, err = mr.readers[0].Read(p)
  11. if n > 0 || err != EOF {
  12. if err == EOF {
  13. // Don't return EOF yet. There may be more bytes
  14. // in the remaining readers.
  15. err = nil
  16. }
  17. return
  18. }
  19. mr.readers = mr.readers[1:]
  20. }
  21. return 0, EOF
  22. }
  23. // MultiReader returns a Reader that's the logical concatenation of
  24. // the provided input readers. They're read sequentially. Once all
  25. // inputs have returned EOF, Read will return EOF. If any of the readers
  26. // return a non-nil, non-EOF error, Read will return that error.
  27. func MultiReader(readers ...Reader) Reader {
  28. r := make([]Reader, len(readers))
  29. copy(r, readers)
  30. return &multiReader{r}
  31. }
  32. type multiWriter struct {
  33. writers []Writer
  34. }
  35. func (t *multiWriter) Write(p []byte) (n int, err error) {
  36. for _, w := range t.writers {
  37. n, err = w.Write(p)
  38. if err != nil {
  39. return
  40. }
  41. if n != len(p) {
  42. err = ErrShortWrite
  43. return
  44. }
  45. }
  46. return len(p), nil
  47. }
  48. // MultiWriter creates a writer that duplicates its writes to all the
  49. // provided writers, similar to the Unix tee(1) command.
  50. func MultiWriter(writers ...Writer) Writer {
  51. w := make([]Writer, len(writers))
  52. copy(w, writers)
  53. return &multiWriter{w}
  54. }