92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package shared
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
 | 
						|
	"github.com/ethereum/go-ethereum/logger"
 | 
						|
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						|
)
 | 
						|
 | 
						|
// Ethereum RPC API interface
 | 
						|
type EthereumApi interface {
 | 
						|
	// API identifier
 | 
						|
	Name() string
 | 
						|
 | 
						|
	// API version
 | 
						|
	ApiVersion() string
 | 
						|
 | 
						|
	// Execute the given request and returns the response or an error
 | 
						|
	Execute(*Request) (interface{}, error)
 | 
						|
 | 
						|
	// List of supported RCP methods this API provides
 | 
						|
	Methods() []string
 | 
						|
}
 | 
						|
 | 
						|
// RPC request
 | 
						|
type Request struct {
 | 
						|
	Id      interface{}     `json:"id"`
 | 
						|
	Jsonrpc string          `json:"jsonrpc"`
 | 
						|
	Method  string          `json:"method"`
 | 
						|
	Params  json.RawMessage `json:"params"`
 | 
						|
}
 | 
						|
 | 
						|
// RPC response
 | 
						|
type Response struct {
 | 
						|
	Id      interface{} `json:"id"`
 | 
						|
	Jsonrpc string      `json:"jsonrpc"`
 | 
						|
}
 | 
						|
 | 
						|
// RPC success response
 | 
						|
type SuccessResponse struct {
 | 
						|
	Id      interface{} `json:"id"`
 | 
						|
	Jsonrpc string      `json:"jsonrpc"`
 | 
						|
	Result  interface{} `json:"result"`
 | 
						|
}
 | 
						|
 | 
						|
// RPC error response
 | 
						|
type ErrorResponse struct {
 | 
						|
	Id      interface{}  `json:"id"`
 | 
						|
	Jsonrpc string       `json:"jsonrpc"`
 | 
						|
	Error   *ErrorObject `json:"error"`
 | 
						|
}
 | 
						|
 | 
						|
// RPC error response details
 | 
						|
type ErrorObject struct {
 | 
						|
	Code    int    `json:"code"`
 | 
						|
	Message string `json:"message"`
 | 
						|
	// Data    interface{} `json:"data"`
 | 
						|
}
 | 
						|
 | 
						|
// Create RPC error response, this allows for custom error codes
 | 
						|
func NewRpcErrorResponse(id interface{}, jsonrpcver string, errCode int, err error) *interface{} {
 | 
						|
	var response interface{}
 | 
						|
 | 
						|
	jsonerr := &ErrorObject{errCode, err.Error()}
 | 
						|
	response = ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr}
 | 
						|
 | 
						|
	glog.V(logger.Detail).Infof("Generated error response: %s", response)
 | 
						|
	return &response
 | 
						|
}
 | 
						|
 | 
						|
// Create RPC response
 | 
						|
func NewRpcResponse(id interface{}, jsonrpcver string, reply interface{}, err error) *interface{} {
 | 
						|
	var response interface{}
 | 
						|
 | 
						|
	switch err.(type) {
 | 
						|
	case nil:
 | 
						|
		response = &SuccessResponse{Jsonrpc: jsonrpcver, Id: id, Result: reply}
 | 
						|
	case *NotImplementedError:
 | 
						|
		jsonerr := &ErrorObject{-32601, err.Error()}
 | 
						|
		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr}
 | 
						|
	case *DecodeParamError, *InsufficientParamsError, *ValidationError, *InvalidTypeError:
 | 
						|
		jsonerr := &ErrorObject{-32602, err.Error()}
 | 
						|
		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr}
 | 
						|
	default:
 | 
						|
		jsonerr := &ErrorObject{-32603, err.Error()}
 | 
						|
		response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr}
 | 
						|
	}
 | 
						|
 | 
						|
	glog.V(logger.Detail).Infof("Generated response: %T %s", response, response)
 | 
						|
	return &response
 | 
						|
}
 |