module RLP::DecodeLazy
def consume_item_lazy(rlp, start)
-
(Array)
- A pair `[item, next_start]` where `item` is the read
Parameters:
-
start
(Integer
) -- the position at which to start reading -
rlp
(String
) -- the rlp string to read from
def consume_item_lazy(rlp, start) t, l, s = consume_length_prefix(rlp, start) if t == :str consume_payload(rlp, s, :str, l) elsif t == :list [LazyList.new(rlp, s, s+l), s+l] else raise "Invalid item type: #{t}" end end
def decode_lazy(rlp, sedes: nil, sedes_options: {})
-
(Object)
- either the already decoded and deserialized object (if
Parameters:
-
sedes_options
(Hash
) -- additional keyword arguments that will be -
sedes
(Object
) -- an object implementing a method `deserialize(code)` -
rlp
(String
) -- the RLP string to decode
def decode_lazy(rlp, sedes: nil, sedes_options: {}) item, next_start = consume_item_lazy(rlp, 0) raise DecodingError.new("RLP length prefix announced wrong length", rlp) if next_start != rlp.size if item.instance_of?(LazyList) item.sedes = sedes item.sedes_options = sedes_options item elsif sedes # FIXME: lazy man's kwargs sedes_options.empty? ? sedes.deserialize(item) : sedes.deserialize(item, **sedes_options) else item end end
def peek(rlp, index, sedes: nil)
-
(IndexError)
- if `index` is invalid (out of range or too many levels)
Parameters:
-
sedes
(#deserialize
) -- a sedes used to deserialize the peeked at -
index
(Integer, Array
) -- the index of the element to peek at (can be -
rlp
(String
) -- the rlp string
Other tags:
- Example: Usage -
def peek(rlp, index, sedes: nil) ll = decode_lazy(rlp) index = Array(index) index.each do |i| raise IndexError, "Too many indices given" if primitive?(ll) ll = ll.fetch(i) end sedes ? sedes.deserialize(ll) : ll end