package api import ( "encoding/json" "fmt" ) // Err represents an http response error following the api format. // These are used by the services to set the *execution status* // directly into the response as JSON alongside response output fields. type Err struct { // error code (unique) Code int `json:"code"` // error small description Reason string `json:"reason"` // associated HTTP status Status int // data that can be added to document the error data []interface{} `json:"data"` } func (e Err) Error() string { return fmt.Sprintf("[%d] %s", e.Code, e.Reason) } // With adds data to document the error and returns the updated error func (e Err) With(data ...interface{}) Err { if e.data == nil { e.data = make([]interface{}, 0) } e.data = append(e.data, data...) return e } // MarshalJSON implements the 'json.Marshaler' interface and is used // to generate the JSON representation of the error func (e Err) MarshalJSON() ([]byte, error) { fmt := make(map[string]interface{}) fmt["code"] = e.Code fmt["reason"] = e.Reason if len(e.data) > 0 { fmt["data"] = e.data } return json.Marshal(fmt) }