class IOStreams::Tabular::Parser::Fixed::Column

Constants

TYPES

Attributes

decimals[R]
key[R]
size[R]
type[R]

Public Class Methods

new(size:, key: nil, type: :string, decimals: 2) click to toggle source
# File lib/io_streams/tabular/parser/fixed.rb, line 149
def initialize(size:, key: nil, type: :string, decimals: 2)
  @key      = key
  @size     = (size == :remainder || size == "remainder") ? -1 : size.to_i
  @type     = type.to_sym
  @decimals = decimals

  unless @size.positive? || (@size == -1)
    raise(Errors::InvalidLayout, "Size #{size.inspect} must be positive or :remainder")
  end
  raise(Errors::InvalidLayout, "Unknown type: #{type.inspect}") unless TYPES.include?(@type)
end

Public Instance Methods

parse(value) click to toggle source
# File lib/io_streams/tabular/parser/fixed.rb, line 161
def parse(value)
  return if value.nil?

  stripped_value = value.to_s.strip

  case type
  when :string
    stripped_value
  when :integer
    stripped_value.length.zero? ? nil : value.to_i
  when :float
    stripped_value.length.zero? ? nil : value.to_f
  else
    raise(Errors::InvalidLayout, "Unsupported type: #{type.inspect}")
  end
end
render(value, truncate) click to toggle source
# File lib/io_streams/tabular/parser/fixed.rb, line 178
def render(value, truncate)
  formatted =
    case type
    when :string
      value = value.to_s
      return value if size == -1

      format(truncate ? "%-#{size}.#{size}s" : "%-#{size}s", value)
    when :integer
      return value.to_i.to_s if size == -1

      truncate = false
      format("%0#{size}d", value.to_i)
    when :float
      return value.to_f.to_s if size == -1

      truncate = false
      format("%0#{size}.#{decimals}f", value.to_f)
    else
      raise(Errors::InvalidLayout, "Unsupported type: #{type.inspect}")
    end

  if !truncate && formatted.length > size
    raise(Errors::ValueTooLong, "Value: #{value} is too large to fit into column:#{key} of size:#{size}")
  end

  formatted
end