module KRPC::Decoder

Public Class Methods

decode(data, type, client) click to toggle source

Given a type object, and serialized data, decode the ruby value/object

# File lib/krpc/decoder.rb, line 9
def decode(data, type, client)
  if type.is_a?(Types::MessageType) then type.ruby_type.decode(data)
  elsif type.is_a?(Types::ValueType) then decode_value(data, type)
  elsif type.is_a?(Types::EnumType)
    v = decode_value(data, 'sint32')
    type.ruby_type.key(v)
  elsif type.is_a?(Types::ClassType)
    remote_oid = decode_value(data, 'uint64')
    if remote_oid != 0
      type.ruby_type.new(client, remote_oid)
    else nil end
  elsif type.is_a?(Types::ListType)
    msg = PB::List.decode(data)
    msg.items.map{|x| decode(x, type.value_type, client)}.to_a
  elsif type.is_a?(Types::DictionaryType)
    msg = PB::Dictionary.decode(data)
    msg.entries.map{|e| [decode(e.key,   type.key_type,   client),
                         decode(e.value, type.value_type, client)]}.to_h
  elsif type.is_a?(Types::SetType)
    msg = PB::Set.decode(data)
    Set.new(msg.items.map{|x| decode(x, type.value_type, client)}.to_a)
  elsif type.is_a?(Types::TupleType)
    msg = PB::Tuple.decode(data)
    msg.items.zip(type.value_types).map{|x,t| decode(x, t, client)}.to_a
  else raise(RuntimeError, "Cannot decode type #{type} from data: #{data}")
  end
end
decode_value(data, type) click to toggle source
# File lib/krpc/decoder.rb, line 37
def decode_value(data, type)
  type_string = type.is_a?(String) ? type : type.protobuf_type.code.to_s.downcase
  ProtobufUtils::Decoder.decode(data, type_string)
end