package commands import "io" type ChannelMarshaler struct { Channel <-chan interface{} Marshaler func(interface{}) (io.Reader, error) reader io.Reader } func (cr *ChannelMarshaler) Read(p []byte) (int, error) { if cr.reader == nil { val, more := <-cr.Channel if !more { return 0, io.EOF } r, err := cr.Marshaler(val) if err != nil { return 0, err } cr.reader = r } n, err := cr.reader.Read(p) if err != nil && err != io.EOF { return n, err } if n == 0 { cr.reader = nil } return n, nil }