aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/message.go
diff options
context:
space:
mode:
authorTaylor Gerring <taylor.gerring@gmail.com>2015-01-13 13:25:29 +0800
committerTaylor Gerring <taylor.gerring@gmail.com>2015-01-13 13:25:29 +0800
commit32bed50ba107ff69ff489e4df6f935fd404a5caa (patch)
tree282d230fca9f73660ccaeafc9db0f0185c33efa0 /rpc/message.go
parentc9985bf563888d5f346408d2ff174167e8b65880 (diff)
downloadgo-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.gz
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.bz2
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.lz
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.xz
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.zst
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.zip
begin conversion to rpc over http
Per specification at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC
Diffstat (limited to 'rpc/message.go')
-rw-r--r--rpc/message.go171
1 files changed, 163 insertions, 8 deletions
diff --git a/rpc/message.go b/rpc/message.go
index c8103eded..f520548c9 100644
--- a/rpc/message.go
+++ b/rpc/message.go
@@ -1,14 +1,169 @@
package rpc
-import "github.com/ethereum/go-ethereum/ethutil"
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
-type Message struct {
- Call string `json:"call"`
- Args []interface{} `json:"args"`
- Id int `json:"_id"`
- Data interface{} `json:"data"`
+ // "github.com/ethereum/go-ethereum/ethutil"
+)
+
+const (
+ ErrorArguments = "Error: Insufficient arguments"
+ ErrorNotImplemented = "Error: Method not implemented"
+ ErrorUnknown = "Error: Unknown error"
+ ErrorParseRequest = "Error: Could not parse request"
+ ErrorDecodeArgs = "Error: Could not decode arguments"
+)
+
+// type JsonResponse interface {
+// }
+
+type ErrorResponse struct {
+ Error bool `json:"error"`
+ ErrorText string `json:"errorText"`
+}
+
+// type SuccessRes struct {
+// Error bool `json:"error"`
+// Result JsonResponse `json:"result"`
+// }
+
+// type Message struct {
+// Call string `json:"call"`
+// Args []interface{} `json:"args"`
+// Id int `json:"_id"`
+// Data interface{} `json:"data"`
+// }
+
+// func (self *Message) Arguments() *ethutil.Value {
+// return ethutil.NewValue(self.Args)
+// }
+
+type RpcSuccessResponse struct {
+ ID int `json:"id"`
+ JsonRpc string `json:"jsonrpc"`
+ Error bool `json:"error"`
+ Result interface{} `json:"result"`
}
-func (self *Message) Arguments() *ethutil.Value {
- return ethutil.NewValue(self.Args)
+type RpcErrorResponse struct {
+ ID int `json:"id"`
+ JsonRpc string `json:"jsonrpc"`
+ Error bool `json:"error"`
+ ErrorText string `json:"errortext"`
+}
+
+type RpcRequest struct {
+ JsonRpc string `json:"jsonrpc"`
+ ID int `json:"id"`
+ Method string `json:"method"`
+ Params []json.RawMessage `json:"params"`
+}
+
+func (req *RpcRequest) ToGetBlockArgs() (*GetBlockArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetBlockArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToNewTxArgs() (*NewTxArgs, error) {
+ if len(req.Params) < 7 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(NewTxArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToPushTxArgs() (*PushTxArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(PushTxArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetStorageArgs() (*GetStorageArgs, error) {
+ if len(req.Params) < 2 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetStorageArgs)
+ // TODO need to pass both arguments
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetTxCountArgs() (*GetTxCountArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetTxCountArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) {
+ if len(req.Params) < 1 {
+ return nil, NewErrorResponse(ErrorArguments)
+ }
+
+ args := new(GetBalanceArgs)
+ r := bytes.NewReader(req.Params[0])
+ err := json.NewDecoder(r).Decode(args)
+ if err != nil {
+ return nil, NewErrorResponse(ErrorDecodeArgs)
+ }
+ jsonlogger.DebugDetailf("%T %v", args, args)
+ return args, nil
+}
+
+// func NewSuccessRes(object JsonResponse) string {
+// e := SuccessRes{Error: false, Result: object}
+// res, err := json.Marshal(e)
+// if err != nil {
+// // This should never happen
+// panic("Creating json error response failed, help")
+// }
+// success := string(res)
+// return success
+// // return res
+// }
+
+func NewErrorResponse(msg string) error {
+ return errors.New(msg)
}