Sha256: 8f23218e690d20db4094c28b5a23628861aae1ce8c24af696c207be3950ae587

Contents?: true

Size: 1.19 KB

Versions: 3

Compression:

Stored size: 1.19 KB

Contents

require 'active_support/time_with_zone'

module Formulaic
  class Form
    ATTRIBUTE_INPUT_MAP = {
      ActiveSupport::TimeWithZone => Formulaic::Inputs::DateInput,
      Date => Formulaic::Inputs::DateInput,
      Array => Formulaic::Inputs::ArrayInput,
      String => Formulaic::Inputs::StringInput,
      TrueClass => Formulaic::Inputs::BooleanInput,
      FalseClass => Formulaic::Inputs::BooleanInput,
    }.freeze

    def initialize(model_name, attributes)
      @inputs = build_inputs(model_name, attributes)
      @session = session
    end

    def fill
      @inputs.each { |input| input.fill }
    end

    private

    attr_reader :session, :model_name, :inputs

    def build_inputs(model_name, attributes)
      attributes.map do |field, value|
        build_input(model_name, field, value)
      end
    end

    def build_input(model_name, field, value)
      input_class_for(value).new(model_name, field, value)
    end

    def input_class_for(value)
      ATTRIBUTE_INPUT_MAP.fetch(value.class) do
        raise InvalidAttributeTypeError.new("Formulaic does not know how to fill in a #{value.class} value")
      end
    end

    class InvalidAttributeTypeError < StandardError; end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
formulaic-0.0.5 lib/formulaic/form.rb
formulaic-0.0.4 lib/formulaic/form.rb
formulaic-0.0.3 lib/formulaic/form.rb