aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/api/mergedapi.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2015-06-11 22:41:43 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2015-06-11 22:41:43 +0800
commite2c2d8e15ebef85c77f7486f92c6430ca6f30785 (patch)
tree1cd237e5aba5453c641a8d631cffd96c9eb08757 /rpc/api/mergedapi.go
parent6609d45ef48ce1c2d2b0e73fa8fe5190d36e3920 (diff)
parentb3c07f167f8b82d1079abe6e15cd1f480712b030 (diff)
downloaddexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar.gz
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar.bz2
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar.lz
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar.xz
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.tar.zst
dexon-e2c2d8e15ebef85c77f7486f92c6430ca6f30785.zip
Merge pull request #1239 from bas-vk/rpc-apis
RPC refactoring
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
+}