aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/api/mergedapi.go
diff options
context:
space:
mode:
Diffstat (limited to 'rpc/api/mergedapi.go')
-rw-r--r--rpc/api/mergedapi.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/rpc/api/mergedapi.go b/rpc/api/mergedapi.go
new file mode 100644
index 000000000..b62477a14
--- /dev/null
+++ b/rpc/api/mergedapi.go
@@ -0,0 +1,66 @@
+package api
+
+import (
+ "github.com/ethereum/go-ethereum/rpc/shared"
+)
+
+const (
+ MergedApiVersion = "1.0"
+)
+
+// combines multiple API's
+type MergedApi struct {
+ apis map[string]string
+ methods map[string]EthereumApi
+}
+
+// create new merged api instance
+func newMergedApi(apis ...EthereumApi) *MergedApi {
+ mergedApi := new(MergedApi)
+ mergedApi.apis = make(map[string]string, len(apis))
+ mergedApi.methods = make(map[string]EthereumApi)
+
+ for _, api := range apis {
+ mergedApi.apis[api.Name()] = api.ApiVersion()
+ 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) ApiVersion() string {
+ return MergedApiVersion
+}
+
+func (self *MergedApi) handle(req *shared.Request) (interface{}, error) {
+ if req.Method == "modules" { // provided API's
+ return self.apis, nil
+ }
+
+ return nil, nil
+}