Class: Protobuf::Field::FieldHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/protobuf/field/field_hash.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field) ⇒ FieldHash

Constructor


15
16
17
18
19
# File 'lib/protobuf/field/field_hash.rb', line 15

def initialize(field)
  @field = field
  @key_field = field.type_class.get_field(:key)
  @value_field = field.type_class.get_field(:value)
end

Instance Attribute Details

#fieldObject (readonly)

Attributes


9
10
11
# File 'lib/protobuf/field/field_hash.rb', line 9

def field
  @field
end

#key_fieldObject (readonly)

Attributes


9
10
11
# File 'lib/protobuf/field/field_hash.rb', line 9

def key_field
  @key_field
end

#value_fieldObject (readonly)

Attributes


9
10
11
# File 'lib/protobuf/field/field_hash.rb', line 9

def value_field
  @value_field
end

Instance Method Details

#[]=(key, val) ⇒ Object Also known as: store

Public Instance Methods


25
26
27
# File 'lib/protobuf/field/field_hash.rb', line 25

def []=(key, val)
  super(normalize_key(key), normalize_val(val))
end

#merge!(other) ⇒ Object Also known as: update


37
38
39
40
41
# File 'lib/protobuf/field/field_hash.rb', line 37

def merge!(other)
  raise_type_error(other) unless other.is_a?(Hash)
  # keys and values will be normalized by []= above
  other.each { |k, v| self[k] = v }
end

#replace(val) ⇒ Object


31
32
33
34
35
# File 'lib/protobuf/field/field_hash.rb', line 31

def replace(val)
  raise_type_error(val) unless val.is_a?(Hash)
  clear
  update(val)
end

#to_hash_valueObject

Return a hash-representation of the given values for this field type. The value in this case would be the hash itself, right? Unfortunately not because the values of the map could be messages themselves that we need to transform.


49
50
51
52
53
# File 'lib/protobuf/field/field_hash.rb', line 49

def to_hash_value
  each_with_object({}) do |(key, value), hash|
    hash[key] = value.respond_to?(:to_hash_value) ? value.to_hash_value : value
  end
end

#to_json_hash_valueObject

Return a hash-representation of the given values for this field type that is safe to convert to JSON.

The value in this case would be the hash itself, right? Unfortunately not because the values of the map could be messages themselves that we need to transform.


61
62
63
64
65
66
67
68
69
70
71
# File 'lib/protobuf/field/field_hash.rb', line 61

def to_json_hash_value
  if field.respond_to?(:json_encode)
    each_with_object({}) do |(key, value), hash|
      hash[key] = field.json_encode(value)
    end
  else
    each_with_object({}) do |(key, value), hash|
      hash[key] = value.respond_to?(:to_json_hash_value) ? value.to_json_hash_value : value
    end
  end
end

#to_sObject


73
74
75
# File 'lib/protobuf/field/field_hash.rb', line 73

def to_s
  "{#{field.name}}"
end