diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-06-11 22:41:43 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-06-11 22:41:43 +0800 |
commit | e2c2d8e15ebef85c77f7486f92c6430ca6f30785 (patch) | |
tree | 1cd237e5aba5453c641a8d631cffd96c9eb08757 /rpc/api/mergedapi.go | |
parent | 6609d45ef48ce1c2d2b0e73fa8fe5190d36e3920 (diff) | |
parent | b3c07f167f8b82d1079abe6e15cd1f480712b030 (diff) | |
download | dexon-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.go | 66 |
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 +} |