class Pikelet::RecordDefinition

Attributes

field_definitions[R]
file_definition[R]

Public Class Methods

new(file_definition, record_class: nil, base:) click to toggle source
# File lib/pikelet/record_definition.rb, line 7
def initialize(file_definition, record_class: nil, base:)
  @file_definition = file_definition
  @field_definitions = base && base.field_definitions.dup || {}
  @record_class = record_class
end

Public Instance Methods

default_record_class() click to toggle source
# File lib/pikelet/record_definition.rb, line 32
def default_record_class
  Struct.new(*field_names) do
    def initialize(**attributes)
      super(*attributes.values_at(*self.class.members))
    end
  end
end
field(name, index, **options, &block) click to toggle source
# File lib/pikelet/record_definition.rb, line 13
def field(name, index, **options, &block)
  field_definitions[name] = Pikelet::FieldDefinition.new(index, **options, &block)
end
format(record, width: nil) click to toggle source
# File lib/pikelet/record_definition.rb, line 21
def format(record, width: nil)
  width ||= self.width
  field_definitions.each_with_object(" " * width) do |(field_name, field_definition), result|
    field_definition.insert(record.send(field_name.to_sym), result)
  end
end
parse(data) click to toggle source
# File lib/pikelet/record_definition.rb, line 17
def parse(data)
  record_class.new(parse_fields(data))
end
record_class() click to toggle source
# File lib/pikelet/record_definition.rb, line 28
def record_class
  @record_class ||= default_record_class
end
signature_field() click to toggle source
# File lib/pikelet/record_definition.rb, line 44
def signature_field
  field_definitions[file_definition.signature_field || :type_signature]
end
width() click to toggle source
# File lib/pikelet/record_definition.rb, line 40
def width
  field_definitions.values.map { |d| d.index.max }.max + 1
end

Private Instance Methods

field_names() click to toggle source
# File lib/pikelet/record_definition.rb, line 50
def field_names
  field_definitions.keys.map(&:to_sym)
end
parse_fields(data) click to toggle source
# File lib/pikelet/record_definition.rb, line 54
def parse_fields(data)
  field_definitions.each_with_object({}) do |(field, definition), result|
    result[field.to_sym] = definition.parse(data)
  end
end