diff options
Diffstat (limited to 'rlp.go')
-rw-r--r-- | rlp.go | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -4,8 +4,110 @@ import ( "fmt" "bytes" "math" + "math/big" ) +type RlpEncoder struct { + rlpData []byte +} +func NewRlpEncoder() *RlpEncoder { + encoder := &RlpEncoder{} + + return encoder +} +func (coder *RlpEncoder) EncodeData(rlpData []interface{}) []byte { + return nil +} + +// Data attributes are returned by the rlp decoder. The data attributes represents +// one item within the rlp data structure. It's responsible for all the casting +// It always returns something valid +type RlpDataAttribute struct { + dataAttrib interface{} +} + +func NewRlpDataAttribute(attrib interface{}) *RlpDataAttribute { + return &RlpDataAttribute{dataAttrib: attrib} +} + +func (attr *RlpDataAttribute) Length() int { + if data, ok := attr.dataAttrib.([]interface{}); ok { + return len(data) + } + + return 0 +} + +func (attr *RlpDataAttribute) AsUint() uint64 { + if value, ok := attr.dataAttrib.(uint8); ok { + return uint64(value) + } else if value, ok := attr.dataAttrib.(uint16); ok { + return uint64(value) + } else if value, ok := attr.dataAttrib.(uint32); ok { + return uint64(value) + } else if value, ok := attr.dataAttrib.(uint64); ok { + return value + } + + return 0 +} + +func (attr *RlpDataAttribute) AsBigInt() *big.Int { + if a, ok := attr.dataAttrib.([]byte); ok { + return Big(string(a)) + } + + return big.NewInt(0) +} + +func (attr *RlpDataAttribute) AsString() string { + if a, ok := attr.dataAttrib.([]byte); ok { + return string(a) + } + + return "" +} + +func (attr *RlpDataAttribute) AsBytes() []byte { + if a, ok := attr.dataAttrib.([]byte); ok { + return a + } + + return make([]byte, 0) +} + +// Threat the attribute as a slice +func (attr *RlpDataAttribute) Get(idx int) *RlpDataAttribute { + if d, ok := attr.dataAttrib.([]interface{}); ok { + // Guard for oob + if len(d) < idx { + return NewRlpDataAttribute(nil) + } + + return NewRlpDataAttribute(d[idx]) + } + + // If this wasn't a slice you probably shouldn't be using this function + return NewRlpDataAttribute(nil) +} + +type RlpDecoder struct { + rlpData interface{} +} +func NewRlpDecoder(rlpData []byte) *RlpDecoder { + decoder := &RlpDecoder{} + // Decode the data + data, _ := Decode(rlpData,0) + decoder.rlpData = data + + return decoder +} + +func (dec *RlpDecoder) Get(idx int) *RlpDataAttribute { + return NewRlpDataAttribute(dec.rlpData).Get(idx) +} + +/// Raw methods func BinaryLength(n uint64) uint64 { if n == 0 { return 0 } @@ -122,6 +224,9 @@ func Encode(object interface{}) []byte { buff.WriteString(string(len(b2) + 55) + b2 + b) } + case *big.Int: + buff.Write(Encode(t.String())) + case string: if len(t) < 56 { buff.WriteString(string(len(t) + 64) + t) |