class IcAgent::Candid::VariantClass
Represents an IDL Variant
Attributes
fields[RW]
Public Class Methods
new(field)
click to toggle source
Calls superclass method
IcAgent::Candid::ConstructType::new
# File lib/ic_agent/candid.rb, line 931 def initialize(field) super() @fields = field.sort_by { |kv| IcAgent::Utils.label_hash(kv[0]) }.to_h end
Public Instance Methods
_build_type_table_impl(type_table)
click to toggle source
# File lib/ic_agent/candid.rb, line 962 def _build_type_table_impl(type_table) @fields.each do |_, v| v.build_type_table(type_table) end opCode = LEB128.encode_signed(TypeIds::Variant).string length = LEB128.encode_signed(@fields.length).string fields = ''.b @fields.each do |k, v| fields += LEB128.encode_signed(IcAgent::Utils.label_hash(k)).string + v.encode_type(type_table) end type_table.add(self, opCode + length + fields) end
covariant(x)
click to toggle source
# File lib/ic_agent/candid.rb, line 936 def covariant(x) return false unless x.length == 1 @fields.each do |k, v| next if !x.key?(k) || v.covariant(x[k]) return false end true end
decode_value(b, t)
click to toggle source
# File lib/ic_agent/candid.rb, line 975 def decode_value(b, t) variant = check_type(t) raise 'Not a variant type' unless variant.is_a?(VariantClass) idx = IcAgent::Candid.leb128u_decode(b) raise "Invalid variant index: #{idx}" if idx >= variant.fields.length keys = variant.fields.keys wireHash = keys[idx] wireType = variant.fields[wireHash] @fields.each do |key, expectType| next unless IcAgent::Utils.label_hash(wireHash) == IcAgent::Utils.label_hash(key) ret = {} value = expectType ? expectType.decode_value(b, wireType) : nil ret[key] = value return ret end raise "Cannot find field hash #{wireHash}" end
display()
click to toggle source
# File lib/ic_agent/candid.rb, line 1007 def display d = {} @fields.each do |k, v| d[k] = v.name || '' end "variant #{d}" end
encode_value(val)
click to toggle source
# File lib/ic_agent/candid.rb, line 948 def encode_value(val) idx = 0 @fields.each do |name, ty| if val.key?(name) count = LEB128.encode_signed(idx).string buf = ty.encode_value(val[name]) return count + buf end idx += 1 end raise "Variant has no data: #{val}" end
id()
click to toggle source
# File lib/ic_agent/candid.rb, line 1003 def id TypeIds::Variant end
name()
click to toggle source
# File lib/ic_agent/candid.rb, line 998 def name fields = @fields.map { |k, v| "#{k}:#{v.name || ''}" }.join(';') "variant {#{fields}}" end