module RLP::DecodeLazy

def consume_item_lazy(rlp, start)

Returns:
  • (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: {})

Returns:
  • (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)

Raises:
  • (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