diff options
author | Felix Lange <fjl@twurst.com> | 2015-03-20 18:45:45 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2015-03-20 21:00:26 +0800 |
commit | f7d1d601e92d3498f0fab5e80e5825d71f5d48fb (patch) | |
tree | ba46271679d29dcdf755da00adaba550a72b7205 /common/value.go | |
parent | c388e7eac0d26f4d299523fd14ec350655f66879 (diff) | |
download | go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar.gz go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar.bz2 go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar.lz go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar.xz go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.tar.zst go-tangerine-f7d1d601e92d3498f0fab5e80e5825d71f5d48fb.zip |
common: make Value encodable with package rlp
Value.{Encode,Decode} are gone. It implements rlp.Encoder and rlp.Decoder
instead, so Value can be decoded into directly.
Diffstat (limited to 'common/value.go')
-rw-r--r-- | common/value.go | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/common/value.go b/common/value.go index 72a123772..f6150cb82 100644 --- a/common/value.go +++ b/common/value.go @@ -3,14 +3,29 @@ package common import ( "bytes" "fmt" + "io" "math/big" "reflect" "strconv" + + "github.com/ethereum/go-ethereum/rlp" ) -// Data values are returned by the rlp decoder. The data values represents -// one item within the rlp data structure. It's responsible for all the casting -// It always returns something valid +// Value can hold values of certain basic types and provides ways to +// convert between types without bothering to check whether the +// conversion is actually meaningful. +// +// It currently supports the following types: +// +// - int{,8,16,32,64} +// - uint{,8,16,32,64} +// - *big.Int +// - []byte, string +// - []interface{} +// +// Value is useful whenever you feel that Go's types limit your +// ability to express yourself. In these situations, use Value and +// forget about this strong typing nonsense. type Value struct { Val interface{} kind reflect.Value @@ -260,26 +275,34 @@ func (self *Value) DeepCmp(o *Value) bool { return bytes.Compare(self.Bytes(), o.Bytes()) == 0 } -func (val *Value) Encode() []byte { - return Encode(val.Val) +func (self *Value) DecodeRLP(s *rlp.Stream) error { + var v interface{} + if err := s.Decode(&v); err != nil { + return err + } + self.Val = v + return nil } -// Assume that the data we have is encoded -func (self *Value) Decode() { - v, _ := Decode(self.Bytes(), 0) - self.Val = v - //self.Val = DecodeWithReader(bytes.NewBuffer(self.Bytes())) +func (self *Value) EncodeRLP(w io.Writer) error { + if self == nil { + w.Write(rlp.EmptyList) + return nil + } else { + return rlp.Encode(w, self.Val) + } } +// NewValueFromBytes decodes RLP data. +// The contained value will be nil if data contains invalid RLP. func NewValueFromBytes(data []byte) *Value { + v := new(Value) if len(data) != 0 { - value := NewValue(data) - value.Decode() - - return value + if err := rlp.DecodeBytes(data, v); err != nil { + v.Val = nil + } } - - return NewValue(nil) + return v } // Value setters |