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