mergedapi.go 1.6 KB
Newer Older
Bas van Kervel's avatar
Bas van Kervel committed
1 2
package api

Bas van Kervel's avatar
Bas van Kervel committed
3
import (
Bas van Kervel's avatar
Bas van Kervel committed
4 5
	"github.com/ethereum/go-ethereum/logger"
	"github.com/ethereum/go-ethereum/logger/glog"
Bas van Kervel's avatar
Bas van Kervel committed
6 7 8 9 10 11
	"github.com/ethereum/go-ethereum/rpc/shared"
)

const (
	MergedApiVersion = "1.0"
)
Bas van Kervel's avatar
Bas van Kervel committed
12 13

// combines multiple API's
Bas van Kervel's avatar
Bas van Kervel committed
14
type MergedApi struct {
Bas van Kervel's avatar
Bas van Kervel committed
15
	apis    map[string]string
16
	methods map[string]shared.EthereumApi
Bas van Kervel's avatar
Bas van Kervel committed
17 18 19
}

// create new merged api instance
20
func newMergedApi(apis ...shared.EthereumApi) *MergedApi {
Bas van Kervel's avatar
Bas van Kervel committed
21
	mergedApi := new(MergedApi)
Bas van Kervel's avatar
Bas van Kervel committed
22
	mergedApi.apis = make(map[string]string, len(apis))
23
	mergedApi.methods = make(map[string]shared.EthereumApi)
Bas van Kervel's avatar
Bas van Kervel committed
24

Bas van Kervel's avatar
Bas van Kervel committed
25 26
	for _, api := range apis {
		mergedApi.apis[api.Name()] = api.ApiVersion()
Bas van Kervel's avatar
Bas van Kervel committed
27 28 29 30 31 32 33 34
		for _, method := range api.Methods() {
			mergedApi.methods[method] = api
		}
	}
	return mergedApi
}

// Supported RPC methods
Bas van Kervel's avatar
Bas van Kervel committed
35
func (self *MergedApi) Methods() []string {
Bas van Kervel's avatar
Bas van Kervel committed
36 37 38 39 40 41 42 43
	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
Bas van Kervel's avatar
Bas van Kervel committed
44
func (self *MergedApi) Execute(req *shared.Request) (interface{}, error) {
Bas van Kervel's avatar
Bas van Kervel committed
45 46
	glog.V(logger.Detail).Infof("rpc method: %s", req.Method)

Bas van Kervel's avatar
Bas van Kervel committed
47 48 49 50 51 52 53 54 55
	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)
}

Bas van Kervel's avatar
Bas van Kervel committed
56
func (self *MergedApi) Name() string {
57
	return shared.MergedApiName
Bas van Kervel's avatar
Bas van Kervel committed
58 59
}

Bas van Kervel's avatar
Bas van Kervel committed
60 61 62 63
func (self *MergedApi) ApiVersion() string {
	return MergedApiVersion
}

Bas van Kervel's avatar
Bas van Kervel committed
64
func (self *MergedApi) handle(req *shared.Request) (interface{}, error) {
Bas van Kervel's avatar
Bas van Kervel committed
65
	if req.Method == "modules" { // provided API's
Bas van Kervel's avatar
Bas van Kervel committed
66 67 68 69 70
		return self.apis, nil
	}

	return nil, nil
}