mergedapi.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package api
  2. import "github.com/ethereum/go-ethereum/rpc/shared"
  3. // combines multiple API's
  4. type mergedApi struct {
  5. apis []string
  6. methods map[string]EthereumApi
  7. }
  8. // create new merged api instance
  9. func newMergedApi(apis ...EthereumApi) *mergedApi {
  10. mergedApi := new(mergedApi)
  11. mergedApi.apis = make([]string, len(apis))
  12. mergedApi.methods = make(map[string]EthereumApi)
  13. for i, api := range apis {
  14. mergedApi.apis[i] = api.Name()
  15. for _, method := range api.Methods() {
  16. mergedApi.methods[method] = api
  17. }
  18. }
  19. return mergedApi
  20. }
  21. // Supported RPC methods
  22. func (self *mergedApi) Methods() []string {
  23. all := make([]string, len(self.methods))
  24. for method, _ := range self.methods {
  25. all = append(all, method)
  26. }
  27. return all
  28. }
  29. // Call the correct API's Execute method for the given request
  30. func (self *mergedApi) Execute(req *shared.Request) (interface{}, error) {
  31. if res, _ := self.handle(req); res != nil {
  32. return res, nil
  33. }
  34. if api, found := self.methods[req.Method]; found {
  35. return api.Execute(req)
  36. }
  37. return nil, shared.NewNotImplementedError(req.Method)
  38. }
  39. func (self *mergedApi) Name() string {
  40. return MergedApiName
  41. }
  42. func (self *mergedApi) handle(req *shared.Request) (interface{}, error) {
  43. if req.Method == "support_apis" { // provided API's
  44. return self.apis, nil
  45. }
  46. return nil, nil
  47. }