46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
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)
|
|
}
|