Module: Avromatic::Model::RawSerialization::Encode::ClassMethods

Defined in:
lib/avromatic/model/raw_serialization.rb

Instance Method Summary collapse

Instance Method Details

#recursive_serialize(value, name: nil, member_types: nil, strict: false) ⇒ Object

rubocop:disable Lint/ShadowedArgument



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/avromatic/model/raw_serialization.rb', line 25

def recursive_serialize(value, name: nil, member_types: nil, strict: false) # rubocop:disable Lint/ShadowedArgument
  member_types = attribute_member_types(name) if name
  member_types ||= EMPTY_ARRAY

  if value.is_a?(Avromatic::Model::Attributes)
    hash = strict ? value.avro_value_datum : value.value_attributes_for_avro
    if !strict && Avromatic.use_custom_datum_writer
      if Avromatic.use_encoding_providers? && !value.class.config.mutable
        # n.b. Ideally we'd just return value here instead of wrapping it in a
        # hash but then we'd have no place to stash the union member index...
        hash = { Avromatic::IO::ENCODING_PROVIDER => value }
      end
      member_index = member_types.index(value.class) if member_types.any?
      hash[Avromatic::IO::UNION_MEMBER_INDEX] = member_index if member_index
    end
    hash
  elsif value.is_a?(Array)
    value.map { |v| recursive_serialize(v, member_types: member_types, strict: strict) }
  elsif value.is_a?(Hash)
    value.each_with_object({}) do |(k, v), map|
      map[k] = recursive_serialize(v, member_types: member_types, strict: strict)
    end
  else
    avro_serializer[name].call(value)
  end
end