parser/envitron/bind.go

48 lines
952 B
Go

package envitron
import (
"encoding/json"
"io"
"github.com/labstack/echo"
)
type jsonError struct {
Message string `json:"error"`
}
func (e jsonError) Error() string {
return e.Message
}
type bindError struct {
Message string `json:"error"`
Offset int64 `json:"offset"`
Field string `json:"field,omitempty"`
}
func (e bindError) Error() string {
return e.Message
}
type jsonBinder struct{}
func (b jsonBinder) Bind(i interface{}, c echo.Context) error {
err := json.NewDecoder(c.Request().Body).Decode(i)
if err == nil {
return nil
}
switch e := err.(type) {
case *json.SyntaxError:
return bindError{Message: `Syntax error`, Offset: e.Offset, Field: ``}
case *json.UnmarshalTypeError:
return bindError{Message: `Type error`, Offset: e.Offset, Field: e.Field}
}
if err == io.ErrUnexpectedEOF || err == io.EOF {
return jsonError{`Unexpected EOF`}
}
return jsonError{`Unknown error occurred while parsing JSON`}
}