splitting.go 578 Bytes
Newer Older
1 2
package importer

3 4 5 6 7 8
import (
	"io"

	u "github.com/jbenet/go-ipfs/util"
)

9 10 11 12 13 14 15
type BlockSplitter interface {
	Split(io.Reader) chan []byte
}

type SizeSplitter struct {
	Size int
}
16

17 18 19 20 21 22 23 24 25
func (ss *SizeSplitter) Split(r io.Reader) chan []byte {
	out := make(chan []byte)
	go func() {
		defer close(out)
		for {
			chunk := make([]byte, ss.Size)
			nread, err := r.Read(chunk)
			if err != nil {
				if err == io.EOF {
26 27
					return
				}
28 29 30 31 32
				u.PErr("block split error: %v\n", err)
				return
			}
			if nread < ss.Size {
				chunk = chunk[:nread]
33
			}
34 35 36 37
			out <- chunk
		}
	}()
	return out
38
}