package jsonrpc import ( "errors" "sync" ) type ( // A MethodRepository has JSON-RPC method functions. MethodRepository struct { m sync.RWMutex r map[string]Metadata } // Metadata has method meta data. Metadata struct { Handler Handler Params interface{} Result interface{} } ) // NewMethodRepository returns new MethodRepository. func NewMethodRepository() *MethodRepository { return &MethodRepository{ m: sync.RWMutex{}, r: map[string]Metadata{}, } } // TakeMethod takes jsonrpc.Func in MethodRepository. func (mr *MethodRepository) TakeMethod(r *Request) (Handler, *Error) { if r.Method == "" || r.Version != Version { return nil, ErrInvalidParams() } mr.m.RLock() md, ok := mr.r[r.Method] mr.m.RUnlock() if !ok { return nil, ErrMethodNotFound() } return md.Handler, nil } // RegisterMethod registers jsonrpc.Func to MethodRepository. func (mr *MethodRepository) RegisterMethod(method string, h Handler, params, result interface{}) error { if method == "" || h == nil { return errors.New("jsonrpc: method name and function should not be empty") } mr.m.Lock() mr.r[method] = Metadata{ Handler: h, Params: params, Result: result, } mr.m.Unlock() return nil } // Methods returns registered methods. func (mr *MethodRepository) Methods() map[string]Metadata { mr.m.RLock() ml := make(map[string]Metadata, len(mr.r)) for k, md := range mr.r { ml[k] = md } mr.m.RUnlock() return ml }