mergedapi.go 1.4 KB

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