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.



500
501
502
# File 'lib/avro/io.rb', line 500

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

Instance Attribute Details

#writers_schemaObject

Returns the value of attribute writers_schema.



499
500
501
# File 'lib/avro/io.rb', line 499

def writers_schema
  @writers_schema
end

Instance Method Details

#write(datum, encoder) ⇒ Object



504
505
506
# File 'lib/avro/io.rb', line 504

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

#write_array(writers_schema, datum, encoder) ⇒ Object



545
546
547
548
549
550
551
552
553
# File 'lib/avro/io.rb', line 545

def write_array(writers_schema, datum, encoder)
  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



508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
# File 'lib/avro/io.rb', line 508

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

  unless Schema.validate(writers_schema, datum, 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



540
541
542
543
# File 'lib/avro/io.rb', line 540

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



536
537
538
# File 'lib/avro/io.rb', line 536

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

#write_map(writers_schema, datum, encoder) ⇒ Object



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

def write_map(writers_schema, datum, encoder)
  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



577
578
579
580
581
# File 'lib/avro/io.rb', line 577

def write_record(writers_schema, datum, encoder)
  writers_schema.fields.each do |field|
    write_data(field.type, datum[field.name], encoder)
  end
end

#write_union(writers_schema, datum, encoder) ⇒ Object



566
567
568
569
570
571
572
573
574
575
# File 'lib/avro/io.rb', line 566

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