Class: Avro::IO::DatumWriter

Inherits:
Object
  • Object
show all
Defined in:
lib/avro/io.rb

Overview

DatumWriter for generic ruby objects

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(writers_schema = nil) ⇒ DatumWriter

Returns a new instance of DatumWriter.



512
513
514
# File 'lib/avro/io.rb', line 512

def initialize(writers_schema=nil)
  @writers_schema = writers_schema
end

Instance Attribute Details

#writers_schemaObject

Returns the value of attribute writers_schema.



511
512
513
# File 'lib/avro/io.rb', line 511

def writers_schema
  @writers_schema
end

Instance Method Details

#write(datum, encoder) ⇒ Object



516
517
518
# File 'lib/avro/io.rb', line 516

def write(datum, encoder)
  write_data(writers_schema, datum, encoder)
end

#write_array(writers_schema, datum, encoder) ⇒ Object

Raises:



557
558
559
560
561
562
563
564
565
566
# File 'lib/avro/io.rb', line 557

def write_array(writers_schema, datum, encoder)
  raise AvroTypeError.new(writers_schema, datum) unless datum.is_a?(Array)
  if datum.size > 0
    encoder.write_long(datum.size)
    datum.each do |item|
      write_data(writers_schema.items, item, encoder)
    end
  end
  encoder.write_long(0)
end

#write_data(writers_schema, logical_datum, encoder) ⇒ Object



520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
# File 'lib/avro/io.rb', line 520

def write_data(writers_schema, logical_datum, encoder)
  datum = writers_schema.type_adapter.encode(logical_datum)

  unless Schema.validate(writers_schema, datum, { recursive: false, encoded: true })
    raise AvroTypeError.new(writers_schema, datum)
  end

  # function dispatch to write datum
  case writers_schema.type_sym
  when :null;    encoder.write_null(datum)
  when :boolean; encoder.write_boolean(datum)
  when :string;  encoder.write_string(datum)
  when :int;     encoder.write_int(datum)
  when :long;    encoder.write_long(datum)
  when :float;   encoder.write_float(datum)
  when :double;  encoder.write_double(datum)
  when :bytes;   encoder.write_bytes(datum)
  when :fixed;   write_fixed(writers_schema, datum, encoder)
  when :enum;    write_enum(writers_schema, datum, encoder)
  when :array;   write_array(writers_schema, datum, encoder)
  when :map;     write_map(writers_schema, datum, encoder)
  when :union;   write_union(writers_schema, datum, encoder)
  when :record, :error, :request;  write_record(writers_schema, datum, encoder)
  else
    raise AvroError.new("Unknown type: #{writers_schema.type}")
  end
end

#write_enum(writers_schema, datum, encoder) ⇒ Object



552
553
554
555
# File 'lib/avro/io.rb', line 552

def write_enum(writers_schema, datum, encoder)
  index_of_datum = writers_schema.symbols.index(datum)
  encoder.write_int(index_of_datum)
end

#write_fixed(writers_schema, datum, encoder) ⇒ Object



548
549
550
# File 'lib/avro/io.rb', line 548

def write_fixed(writers_schema, datum, encoder)
  encoder.write(datum)
end

#write_map(writers_schema, datum, encoder) ⇒ Object

Raises:



568
569
570
571
572
573
574
575
576
577
578
# File 'lib/avro/io.rb', line 568

def write_map(writers_schema, datum, encoder)
  raise AvroTypeError.new(writers_schema, datum) unless datum.is_a?(Hash)
  if datum.size > 0
    encoder.write_long(datum.size)
    datum.each do |k,v|
      encoder.write_string(k)
      write_data(writers_schema.values, v, encoder)
    end
  end
  encoder.write_long(0)
end

#write_record(writers_schema, datum, encoder) ⇒ Object

Raises:



591
592
593
594
595
596
# File 'lib/avro/io.rb', line 591

def write_record(writers_schema, datum, encoder)
  raise AvroTypeError.new(writers_schema, datum) unless datum.is_a?(Hash)
  writers_schema.fields.each do |field|
    write_data(field.type, datum[field.name], encoder)
  end
end

#write_union(writers_schema, datum, encoder) ⇒ Object



580
581
582
583
584
585
586
587
588
589
# File 'lib/avro/io.rb', line 580

def write_union(writers_schema, datum, encoder)
  index_of_schema = -1
  found = writers_schema.schemas.
    find{|e| index_of_schema += 1; found = Schema.validate(e, datum) }
  unless found  # Because find_index doesn't exist in 1.8.6
    raise AvroTypeError.new(writers_schema, datum)
  end
  encoder.write_long(index_of_schema)
  write_data(writers_schema.schemas[index_of_schema], datum, encoder)
end