class IcAgent::Candid::RecordClass
Represents an IDL Record
Public Class Methods
new(field)
click to toggle source
Calls superclass method
IcAgent::Candid::ConstructType::new
# File lib/ic_agent/candid.rb, line 775 def initialize(field) super() @fields = field.sort_by { |k, _v| IcAgent::Utils.label_hash(k) }.to_h end
Public Instance Methods
_build_type_table_impl(type_table)
click to toggle source
# File lib/ic_agent/candid.rb, line 808 def _build_type_table_impl(type_table) @fields.values.each do |field_value| field_value.send(:build_type_table, type_table) end op_code = LEB128.encode_signed(TypeIds::Record).string length = LEB128.encode_signed(@fields.size).string fields = @fields.map { |k, v| LEB128.encode_signed(IcAgent::Utils.label_hash(k)).string + v.encode_type(type_table) }.join.b type_table.add(self, op_code + length + fields) end
covariant(x)
click to toggle source
# File lib/ic_agent/candid.rb, line 792 def covariant(x) raise ArgumentError, 'Expected dict type input.' unless x.is_a?(Hash) @fields.each do |k, v| raise ArgumentError, "Record is missing key #{k}" unless x.key?(k) return false unless v.covariant(x[k]) end true end
decode_value(b, t)
click to toggle source
# File lib/ic_agent/candid.rb, line 822 def decode_value(b, t) record = check_type(t) raise ArgumentError, 'Not a record type' unless record.is_a?(RecordClass) x = {} idx = 0 keys = @fields.keys @fields.each do |k, v| if idx >= @fields.length || IcAgent::Utils.label_hash(keys[idx]) != IcAgent::Utils.label_hash(k) # skip field v.decode_value(b, v) next end expect_key = keys[idx] expected_value = @fields[expect_key] x[expect_key] = expected_value.decode_value(b, v) idx += 1 end raise ArgumentError, "Cannot find field #{keys[idx]}" if idx < @fields.length x end
display()
click to toggle source
# File lib/ic_agent/candid.rb, line 856 def display d = {} @fields.each { |k, v| d[v] = v.display } "record #{d}" end
encode_value(val)
click to toggle source
# File lib/ic_agent/candid.rb, line 803 def encode_value(val) bufs = @fields.map { |k, v| v.encode_value(val[k]) } bufs.join.b end
id()
click to toggle source
# File lib/ic_agent/candid.rb, line 852 def id TypeIds::Record end
name()
click to toggle source
# File lib/ic_agent/candid.rb, line 847 def name fields = @fields.map { |k, v| "#{k}:#{v.name}" }.join(';') "record {#{fields}}" end
try_as_tuple()
click to toggle source
# File lib/ic_agent/candid.rb, line 780 def try_as_tuple res = [] idx = 0 @fields.each do |k, v| return nil unless k == "_#{idx}_" # check res << v idx += 1 end res end