8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# File 'lib/avromatic/io/datum_writer.rb', line 8
def write_union(writers_schema, datum, encoder)
optional = writers_schema.schemas.first.type_sym == :null
if datum.is_a?(Avromatic::IO::UnionDatum)
index_of_schema = datum.member_index
index_of_schema += 1 if optional
datum = datum.datum
elsif optional && writers_schema.schemas.size == 2
index_of_schema = datum.nil? ? 0 : 1
else
index_of_schema = writers_schema.schemas.find_index do |schema|
Avro::Schema.validate(schema, datum)
end
end
raise Avro::IO::AvroTypeError.new(writers_schema, datum) unless index_of_schema
encoder.write_long(index_of_schema)
write_data(writers_schema.schemas[index_of_schema], datum, encoder)
end
|