class TextExtractor::Record::FactoryAnalyzer

converts the value of the factory option to a constructor proc

Public Class Methods

new(factory) click to toggle source
# File lib/text_extractor/record.rb, line 102
def initialize(factory)
  @params = nil

  case factory
  when Hash
    @klass, @params = factory.first
  else
    @klass = factory
  end
end

Public Instance Methods

to_proc() click to toggle source
# File lib/text_extractor/record.rb, line 113
def to_proc
  if @params
    explicit
  elsif @klass.respond_to?(:call)
    @klass
  elsif @klass
    implicit
  end
end

Private Instance Methods

explicit() click to toggle source
# File lib/text_extractor/record.rb, line 125
def explicit
  case @params
  when Array
    positional
  when Set
    keyword
  end
end
implicit() click to toggle source
# File lib/text_extractor/record.rb, line 147
def implicit
  if @klass.ancestors.include?(Struct)
    ->(extracted) { @klass.new(*extracted.values) }
  else
    ->(extracted) { @klass.new(**extracted) }
  end
end
keyword() click to toggle source
# File lib/text_extractor/record.rb, line 138
def keyword
  lambda do |extracted|
    values = @params.each_with_object({}) do |param, hash|
      hash[param] = extracted[param]
    end
    @klass.new(**values)
  end
end
positional() click to toggle source
# File lib/text_extractor/record.rb, line 134
def positional
  ->(extracted) { @klass.new(*extracted.values_at(*@params)) }
end