lib/avromatic/model/raw_serialization.rb in avromatic-0.28.1 vs lib/avromatic/model/raw_serialization.rb in avromatic-0.29.0
- old
+ new
@@ -20,31 +20,31 @@
included do
@attribute_member_types = {}
end
module ClassMethods
- def recursive_serialize(value, name: nil, member_types: nil)
+ def recursive_serialize(value, name: nil, member_types: nil, strict: false)
member_types = attribute_member_types(name) if name
member_types ||= EMPTY_ARRAY
if value.is_a?(Avromatic::Model::Attributes)
- hash = value.value_attributes_for_avro
- if Avromatic.use_custom_datum_writer
+ 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) }
+ 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)
+ map[k] = recursive_serialize(v, member_types: member_types, strict: strict)
end
else
avro_serializer[name].call(value)
end
end
@@ -94,14 +94,26 @@
def key_attributes_for_avro
avro_hash(key_avro_field_names)
end
+ def avro_value_datum
+ if self.class.config.mutable
+ avro_hash(value_avro_field_names, strict: true)
+ else
+ @avro_datum ||= avro_hash(value_avro_field_names, strict: true)
+ end
+ end
+
+ def avro_key_datum
+ avro_hash(key_avro_field_names, strict: true)
+ end
+
private
- def avro_hash(fields)
+ def avro_hash(fields, strict: false)
attributes.slice(*fields).each_with_object(Hash.new) do |(key, value), result|
- result[key.to_s] = self.class.recursive_serialize(value, name: key)
+ result[key.to_s] = self.class.recursive_serialize(value, name: key, strict: strict)
end
end
def avro_raw_encode(data, key_or_value = :value)
stream = StringIO.new