Commit 0452a5f7 authored by Matt Bell's avatar Matt Bell

commands: Made default JSON marshaler support channel output

parent cf1e770e
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
}
......@@ -40,20 +40,30 @@ const (
// TODO: support more encoding types
)
func marshalJson(value interface{}) (io.Reader, error) {
b, err := json.MarshalIndent(value, "", " ")
if err != nil {
return nil, err
}
return bytes.NewReader(b), nil
}
var marshallers = map[EncodingType]Marshaler{
JSON: func(res Response) (io.Reader, error) {
if ch, ok := res.Output().(chan interface{}); ok {
return &ChannelMarshaler{
Channel: ch,
Marshaler: marshalJson,
}, nil
}
var value interface{}
if res.Error() != nil {
value = res.Error()
} else {
value = res.Output()
}
b, err := json.MarshalIndent(value, "", " ")
if err != nil {
return nil, err
}
return bytes.NewReader(b), nil
return marshalJson(value)
},
XML: func(res Response) (io.Reader, error) {
var value interface{}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment