mergedapi.go 1.6 KB

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