class Pikelet::FileDefinition

Attributes

base[R]
signature_field[R]

Public Class Methods

new(signature_field: nil, record_class: nil, &block) click to toggle source
# File lib/pikelet/file_definition.rb, line 5
def initialize(signature_field: nil, record_class: nil, &block)
  @signature_field = signature_field
  if block_given?
    @base = define_record(nil, record_class: record_class, base: nil, &block)
  end
end

Public Instance Methods

define_record(signature, record_class:, base:, &block) click to toggle source
# File lib/pikelet/file_definition.rb, line 12
def define_record(signature, record_class:, base:, &block)
  record_definitions[signature] = RecordDefiner.define(self, record_class: record_class, base: base, &block)
end
format(records) click to toggle source
# File lib/pikelet/file_definition.rb, line 24
def format(records)
  records.map { |record| format_record(record, width: width) }
end
parse(data, &block) click to toggle source
# File lib/pikelet/file_definition.rb, line 20
def parse(data, &block)
  parse_records(data, &block)
end
record_definitions() click to toggle source
# File lib/pikelet/file_definition.rb, line 16
def record_definitions
  @record_definitions ||= {}
end
width() click to toggle source
# File lib/pikelet/file_definition.rb, line 28
def width
  record_definitions.values.map(&:width).max
end

Private Instance Methods

format_record(record, width:) click to toggle source
# File lib/pikelet/file_definition.rb, line 39
def format_record(record, width:)
  definition = record_definitions[record_signature(record)]
  definition.format(record, width: width)
end
parse_record(data) click to toggle source
# File lib/pikelet/file_definition.rb, line 56
def parse_record(data)
  signatures = signature_fields.lazy.map { |field| field.parse(data) }.reject(&:nil?)
  definition = signatures.map { |sig| record_definitions[sig] }.reject(&:nil?).first || base
  definition.parse(data)
end
parse_records(data, &block) click to toggle source
# File lib/pikelet/file_definition.rb, line 44
def parse_records(data, &block)
  data.map(&method(:parse_record)).tap do |records|
    if block_given?
      records.each(&block)
    end
  end
end
record_signature(record) click to toggle source
# File lib/pikelet/file_definition.rb, line 34
def record_signature(record)
  field = signature_field || (record_definitions.values.detect(&:signature_field) && :type_signature)
  record.send(field) if field && record.respond_to?(field)
end
signature_fields() click to toggle source
# File lib/pikelet/file_definition.rb, line 52
def signature_fields
  record_definitions.values.map(&:signature_field).compact.uniq
end