66 lines
1.1 KiB
Go
66 lines
1.1 KiB
Go
|
|
package jsonrpc
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"errors"
|
||
|
|
"reflect"
|
||
|
|
)
|
||
|
|
|
||
|
|
const eTempWSError = -1111111
|
||
|
|
|
||
|
|
type RPCConnectionError struct {
|
||
|
|
err error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *RPCConnectionError) Error() string {
|
||
|
|
if e.err != nil {
|
||
|
|
return e.err.Error()
|
||
|
|
}
|
||
|
|
return "RPCConnectionError"
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *RPCConnectionError) Unwrap() error {
|
||
|
|
if e.err != nil {
|
||
|
|
return e.err
|
||
|
|
}
|
||
|
|
return errors.New("RPCConnectionError")
|
||
|
|
}
|
||
|
|
|
||
|
|
type Errors struct {
|
||
|
|
byType map[reflect.Type]ErrorCode
|
||
|
|
byCode map[ErrorCode]reflect.Type
|
||
|
|
}
|
||
|
|
|
||
|
|
type ErrorCode int
|
||
|
|
|
||
|
|
const FirstUserCode = 2
|
||
|
|
|
||
|
|
func NewErrors() Errors {
|
||
|
|
return Errors{
|
||
|
|
byType: map[reflect.Type]ErrorCode{},
|
||
|
|
byCode: map[ErrorCode]reflect.Type{
|
||
|
|
-1111111: reflect.TypeOf(&RPCConnectionError{}),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (e *Errors) Register(c ErrorCode, typ interface{}) {
|
||
|
|
rt := reflect.TypeOf(typ).Elem()
|
||
|
|
if !rt.Implements(errorType) {
|
||
|
|
panic("can't register non-error types")
|
||
|
|
}
|
||
|
|
|
||
|
|
e.byType[rt] = c
|
||
|
|
e.byCode[c] = rt
|
||
|
|
}
|
||
|
|
|
||
|
|
type marshalable interface {
|
||
|
|
json.Marshaler
|
||
|
|
json.Unmarshaler
|
||
|
|
}
|
||
|
|
|
||
|
|
type RPCErrorCodec interface {
|
||
|
|
FromJSONRPCError(JSONRPCError) error
|
||
|
|
ToJSONRPCError() (JSONRPCError, error)
|
||
|
|
}
|