1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-08-06 19:44:01 +08:00
Files
kubo/commands/response.go
Juan Batiz-Benet bbef82f4fa "enc" -> EncShort
2014-10-20 08:00:28 -07:00

85 lines
2.0 KiB
Go

package commands
import (
"encoding/json"
"encoding/xml"
"fmt"
"strings"
)
// ErrorType signfies a category of errors
type ErrorType uint
// ErrorTypes convey what category of error ocurred
const (
ErrNormal ErrorType = iota // general errors
ErrClient // error was caused by the client, (e.g. invalid CLI usage)
// TODO: add more types of errors for better error-specific handling
)
// Error is a struct for marshalling errors
type Error struct {
Message string
Code ErrorType
}
func (e *Error) Error() string {
return fmt.Sprintf("%d error: %s", e.Code, e.Message)
}
// EncodingType defines a supported encoding
type EncodingType string
// Supported EncodingType constants.
const (
JSON = "json"
XML = "xml"
// TODO: support more encoding types
)
// Marshaller is a function used by coding types.
// TODO this should just be a `coding.Codec`
type Marshaller func(v interface{}) ([]byte, error)
var marshallers = map[EncodingType]Marshaller{
JSON: json.Marshal,
XML: xml.Marshal,
}
// Response is the result of a command request. Handlers write to the response,
// setting Error or Value. Response is returned to the client.
type Response struct {
req *Request
Error *Error
Value interface{}
}
// SetError updates the response Error.
func (r *Response) SetError(err error, code ErrorType) {
r.Error = &Error{Message: err.Error(), Code: code}
}
// Marshal marshals out the response into a buffer. It uses the EncodingType
// on the Request to chose a Marshaller (Codec).
func (r *Response) Marshal() ([]byte, error) {
if r.Error == nil && r.Value == nil {
return nil, fmt.Errorf("No error or value set, there is nothing to marshal")
}
enc, ok := r.req.Option(EncShort)
if !ok || enc.(string) == "" {
return nil, fmt.Errorf("No encoding type was specified")
}
encType := EncodingType(strings.ToLower(enc.(string)))
marshaller, ok := marshallers[encType]
if !ok {
return nil, fmt.Errorf("No marshaller found for encoding type '%s'", enc)
}
if r.Error != nil {
return marshaller(r.Error)
}
return marshaller(r.Value)
}