diff options
Diffstat (limited to 'rpc/api/mergedapi.go')
-rw-r--r-- | rpc/api/mergedapi.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/rpc/api/mergedapi.go b/rpc/api/mergedapi.go new file mode 100644 index 000000000..7784661d7 --- /dev/null +++ b/rpc/api/mergedapi.go @@ -0,0 +1,56 @@ +package api + +import "github.com/ethereum/go-ethereum/rpc/shared" + +// combines multiple API's +type mergedApi struct { + apis []string + methods map[string]EthereumApi +} + +// create new merged api instance +func newMergedApi(apis ...EthereumApi) *mergedApi { + mergedApi := new(mergedApi) + mergedApi.apis = make([]string, len(apis)) + mergedApi.methods = make(map[string]EthereumApi) + + for i, api := range apis { + mergedApi.apis[i] = api.Name() + for _, method := range api.Methods() { + mergedApi.methods[method] = api + } + } + return mergedApi +} + +// Supported RPC methods +func (self *mergedApi) Methods() []string { + all := make([]string, len(self.methods)) + for method, _ := range self.methods { + all = append(all, method) + } + return all +} + +// Call the correct API's Execute method for the given request +func (self *mergedApi) Execute(req *shared.Request) (interface{}, error) { + if res, _ := self.handle(req); res != nil { + return res, nil + } + if api, found := self.methods[req.Method]; found { + return api.Execute(req) + } + return nil, shared.NewNotImplementedError(req.Method) +} + +func (self *mergedApi) Name() string { + return MergedApiName +} + +func (self *mergedApi) handle(req *shared.Request) (interface{}, error) { + if req.Method == "support_apis" { // provided API's + return self.apis, nil + } + + return nil, nil +} |