Sha256: 161bd1e7f0e6cbb289ba872aee685d6126c30b8b7643fc66fe34282e097eaa94

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

module Yaoc

  class ConverterBuilder
    attr_accessor  :build_commands, :command_order

    def initialize(command_order=:recorded_order, fetcher=:fetch)
      self.build_commands = []
      self.command_order = command_order
      self.fetcher = fetcher
    end

    def add_mapping(&block)
      instance_eval &block
      apply_commands!
    end

    def converter_class
      @converter_class ||= Struct.new(:to_convert, :fetcher) do
        include MappingBase
        include Strategies::ToHashMapping
      end
    end


    def rule(to: nil, from: to, converter: nil)
      to_s = Array(to)
      from_s = Array(from)
      converter_s = Array(converter)

      to_s.each_with_index do |to, index|
        build_commands.push  ->{ converter_class.map(to, from_s[index] || to, converter_s[index]) }
      end
    end

    def apply_commands!
      reset_converters!

      build_commands_ordered.each &:call
    end

    def converter(fetch_able)
      converter_class.new(fetch_able, fetcher)
    end

    def fetcher=(new_fetcher)
      @fetcher= new_fetcher
    end

    protected

    def fetcher
      @fetcher ||= :fetch
    end

    def fetch_with(new_fetcher)
      self.fetcher = new_fetcher
    end

    def build_commands_ordered
      if command_order == :recorded_order
        build_commands
      else
        build_commands.reverse
      end
    end

    def reset_converters!
      @converter_class = nil
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
yaoc-0.0.3 lib/yaoc/converter_builder.rb