messages.go 8.55 KB
Newer Older
Taylor Gerring's avatar
Taylor Gerring committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
  This file is part of go-ethereum

  go-ethereum is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  go-ethereum is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>.
*/
obscuren's avatar
obscuren committed
17 18
package rpc

19 20 21 22
import (
	"bytes"
	"encoding/json"
	"errors"
obscuren's avatar
obscuren committed
23
	"fmt"
24 25

	"github.com/ethereum/go-ethereum/xeth"
26 27
)

Taylor Gerring's avatar
Taylor Gerring committed
28 29 30 31 32
var (
	errArguments      = errors.New("Error: Insufficient arguments")
	errNotImplemented = errors.New("Error: Method not implemented")
	errUnknown        = errors.New("Error: Unknown error")
	errDecodeArgs     = errors.New("Error: Could not decode arguments")
33 34
)

35
type RpcRequest struct {
36
	ID      interface{}       `json:"id"`
37 38 39
	JsonRpc string            `json:"jsonrpc"`
	Method  string            `json:"method"`
	Params  []json.RawMessage `json:"params"`
40 41 42
}

type RpcSuccessResponse struct {
43
	ID      interface{} `json:"id"`
44 45
	JsonRpc string      `json:"jsonrpc"`
	Result  interface{} `json:"result"`
obscuren's avatar
obscuren committed
46 47
}

48
type RpcErrorResponse struct {
49
	ID      interface{}     `json:"id"`
50 51
	JsonRpc string          `json:"jsonrpc"`
	Error   *RpcErrorObject `json:"error"`
52 53
}

54 55 56 57
type RpcErrorObject struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	// Data    interface{} `json:"data"`
58 59
}

Taylor Gerring's avatar
Taylor Gerring committed
60 61
func NewErrorWithMessage(err error, msg string) error {
	return fmt.Errorf("%s: %s", err.Error(), msg)
obscuren's avatar
obscuren committed
62 63
}

64 65
func (req *RpcRequest) ToSha3Args() (*Sha3Args, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
66
		return nil, errArguments
67 68 69 70 71
	}

	args := new(Sha3Args)
	r := bytes.NewReader(req.Params[0])
	if err := json.NewDecoder(r).Decode(args); err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
72
		return nil, errDecodeArgs
73
	}
Taylor Gerring's avatar
Taylor Gerring committed
74

75 76 77
	return args, nil
}

78 79
func (req *RpcRequest) ToGetBlockArgs() (*GetBlockArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
80
		return nil, errArguments
81 82 83 84 85 86
	}

	args := new(GetBlockArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
87
		return nil, errDecodeArgs
88
	}
Taylor Gerring's avatar
Taylor Gerring committed
89

90 91 92 93
	return args, nil
}

func (req *RpcRequest) ToNewTxArgs() (*NewTxArgs, error) {
obscuren's avatar
obscuren committed
94
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
95
		return nil, errArguments
96 97 98 99 100 101
	}

	args := new(NewTxArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
102
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
103
	}
Taylor Gerring's avatar
Taylor Gerring committed
104

105 106 107 108 109
	return args, nil
}

func (req *RpcRequest) ToPushTxArgs() (*PushTxArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
110
		return nil, errArguments
111 112 113 114 115 116
	}

	args := new(PushTxArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
117
		return nil, errDecodeArgs
118
	}
Taylor Gerring's avatar
Taylor Gerring committed
119

120 121 122
	return args, nil
}

obscuren's avatar
obscuren committed
123 124
func (req *RpcRequest) ToGetStateArgs() (*GetStateArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
125
		return nil, errArguments
126 127
	}

obscuren's avatar
obscuren committed
128
	args := new(GetStateArgs)
129 130 131 132
	// TODO need to pass both arguments
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
133
		return nil, errDecodeArgs
134
	}
Taylor Gerring's avatar
Taylor Gerring committed
135

136 137 138
	return args, nil
}

obscuren's avatar
obscuren committed
139 140
func (req *RpcRequest) ToStorageAtArgs() (*GetStorageArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
141
		return nil, errArguments
obscuren's avatar
obscuren committed
142 143 144 145 146 147
	}

	args := new(GetStorageArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
148
		return nil, errDecodeArgs
obscuren's avatar
obscuren committed
149
	}
Taylor Gerring's avatar
Taylor Gerring committed
150

obscuren's avatar
obscuren committed
151 152 153
	return args, nil
}

154 155
func (req *RpcRequest) ToGetTxCountArgs() (*GetTxCountArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
156
		return nil, errArguments
157 158 159 160 161 162
	}

	args := new(GetTxCountArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
163
		return nil, errDecodeArgs
164
	}
Taylor Gerring's avatar
Taylor Gerring committed
165

166 167 168 169 170
	return args, nil
}

func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
171
		return nil, errArguments
172 173 174 175 176 177
	}

	args := new(GetBalanceArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
178
		return nil, errDecodeArgs
179
	}
Taylor Gerring's avatar
Taylor Gerring committed
180

181 182 183
	return args, nil
}

Taylor Gerring's avatar
Taylor Gerring committed
184 185
func (req *RpcRequest) ToGetCodeAtArgs() (*GetCodeAtArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
186
		return nil, errArguments
Taylor Gerring's avatar
Taylor Gerring committed
187 188 189 190 191 192
	}

	args := new(GetCodeAtArgs)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
193
		return nil, errDecodeArgs
Taylor Gerring's avatar
Taylor Gerring committed
194
	}
Taylor Gerring's avatar
Taylor Gerring committed
195

Taylor Gerring's avatar
Taylor Gerring committed
196 197
	return args, nil
}
198

199 200
func (req *RpcRequest) ToBoolArgs() (bool, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
201
		return false, errArguments
202 203 204 205 206
	}

	var args bool
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
207
		return false, errDecodeArgs
208 209 210 211 212
	}

	return args, nil
}

213 214 215 216 217 218 219 220 221 222 223 224 225
func (req *RpcRequest) ToIntArgs() (int, error) {
	if len(req.Params) < 1 {
		return 0, errArguments
	}

	var args int
	if err := json.Unmarshal(req.Params[0], &args); err != nil {
		return 0, errArguments
	}

	return args, nil
}

226 227
func (req *RpcRequest) ToCompileArgs() (string, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
228
		return "", errArguments
229 230 231 232 233
	}

	var args string
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
234
		return "", errDecodeArgs
235 236 237 238 239
	}

	return args, nil
}

240 241
func (req *RpcRequest) ToFilterArgs() (*FilterOptions, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
242
		return nil, errArguments
243 244 245 246 247 248
	}

	args := new(FilterOptions)
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
249
		return nil, errDecodeArgs
250 251 252 253
	}
	return args, nil
}

obscuren's avatar
obscuren committed
254 255
func (req *RpcRequest) ToFilterStringArgs() (string, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
256
		return "", errArguments
obscuren's avatar
obscuren committed
257 258 259 260 261
	}

	var args string
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
262
		return "", errDecodeArgs
obscuren's avatar
obscuren committed
263 264 265 266 267
	}

	return args, nil
}

268 269
func (req *RpcRequest) ToUninstallFilterArgs() (int, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
270
		return 0, errArguments
271 272 273 274 275
	}

	var args int
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
276
		return 0, errDecodeArgs
277 278 279 280 281
	}

	return args, nil
}

282 283
func (req *RpcRequest) ToFilterChangedArgs() (int, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
284
		return 0, errArguments
285 286 287 288 289 290
	}

	var id int
	r := bytes.NewReader(req.Params[0])
	err := json.NewDecoder(r).Decode(&id)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
291
		return 0, errDecodeArgs
292 293 294 295
	}
	return id, nil
}

obscuren's avatar
obscuren committed
296 297
func (req *RpcRequest) ToDbPutArgs() (*DbArgs, error) {
	if len(req.Params) < 3 {
Taylor Gerring's avatar
Taylor Gerring committed
298
		return nil, errArguments
obscuren's avatar
obscuren committed
299 300 301 302 303
	}

	var args DbArgs
	err := json.Unmarshal(req.Params[0], &args.Database)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
304
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
obscuren's avatar
obscuren committed
305 306 307
	}
	err = json.Unmarshal(req.Params[1], &args.Key)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
308
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
obscuren's avatar
obscuren committed
309 310 311
	}
	err = json.Unmarshal(req.Params[2], &args.Value)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
312
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
obscuren's avatar
obscuren committed
313
	}
Taylor Gerring's avatar
Taylor Gerring committed
314

obscuren's avatar
obscuren committed
315 316 317 318 319
	return &args, nil
}

func (req *RpcRequest) ToDbGetArgs() (*DbArgs, error) {
	if len(req.Params) < 2 {
Taylor Gerring's avatar
Taylor Gerring committed
320
		return nil, errArguments
obscuren's avatar
obscuren committed
321 322 323 324 325
	}

	var args DbArgs
	err := json.Unmarshal(req.Params[0], &args.Database)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
326
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
obscuren's avatar
obscuren committed
327 328 329 330
	}

	err = json.Unmarshal(req.Params[1], &args.Key)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
331
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
obscuren's avatar
obscuren committed
332
	}
Taylor Gerring's avatar
Taylor Gerring committed
333

obscuren's avatar
obscuren committed
334 335
	return &args, nil
}
336 337 338

func (req *RpcRequest) ToWhisperFilterArgs() (*xeth.Options, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
339
		return nil, errArguments
340 341 342 343 344
	}

	var args xeth.Options
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
345
		return nil, NewErrorWithMessage(errDecodeArgs, err.Error())
346
	}
Taylor Gerring's avatar
Taylor Gerring committed
347

348 349 350
	return &args, nil
}

obscuren's avatar
obscuren committed
351
func (req *RpcRequest) ToIdArgs() (int, error) {
352
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
353
		return 0, errArguments
354 355 356 357 358
	}

	var id int
	err := json.Unmarshal(req.Params[0], &id)
	if err != nil {
Taylor Gerring's avatar
Taylor Gerring committed
359
		return 0, errDecodeArgs
360
	}
Taylor Gerring's avatar
Taylor Gerring committed
361

362 363 364 365 366
	return id, nil
}

func (req *RpcRequest) ToWhisperPostArgs() (*WhisperMessageArgs, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
367
		return nil, errArguments
368 369 370 371 372 373 374
	}

	var args WhisperMessageArgs
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
		return nil, err
	}
Taylor Gerring's avatar
Taylor Gerring committed
375

376 377
	return &args, nil
}
obscuren's avatar
obscuren committed
378 379 380

func (req *RpcRequest) ToWhisperHasIdentityArgs() (string, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
381
		return "", errArguments
obscuren's avatar
obscuren committed
382 383 384 385 386 387 388
	}

	var args string
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
		return "", err
	}
Taylor Gerring's avatar
Taylor Gerring committed
389

obscuren's avatar
obscuren committed
390 391
	return args, nil
}
392 393 394

func (req *RpcRequest) ToRegisterArgs() (string, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
395
		return "", errArguments
396 397 398 399 400 401 402
	}

	var args string
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
		return "", err
	}
Taylor Gerring's avatar
Taylor Gerring committed
403

404 405 406 407 408
	return args, nil
}

func (req *RpcRequest) ToWatchTxArgs() (string, error) {
	if len(req.Params) < 1 {
Taylor Gerring's avatar
Taylor Gerring committed
409
		return "", errArguments
410 411 412 413 414 415 416
	}

	var args string
	err := json.Unmarshal(req.Params[0], &args)
	if err != nil {
		return "", err
	}
Taylor Gerring's avatar
Taylor Gerring committed
417

418 419
	return args, nil
}