Sha256: 04f49a7ec5ed03c5028bf4795652a18b548e3c93b27c3f67604cd4b4d5e0180c

Contents?: true

Size: 1.48 KB

Versions: 395

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/hash/indifferent_access'
require 'ostruct'

module EacRubyUtils
  class OptionsConsumer
    DEFAULT_OPTIONS = { validate: true, ostruct: false }.with_indifferent_access.freeze

    def initialize(data)
      @data = data.with_indifferent_access
    end

    def consume(key, default_value = nil, &block)
      return default_value unless data.key?(key)

      value = data.delete(key)
      value = yield(value) if block
      value
    end

    # If last argument is a Hash it is used a options.
    # Options:
    # * +validate+: validate after consume.
    # * +ostruct+: return a [OpenStruct] instead a [Hash].
    # @return [Hash] (Default) or [OpenStruct].
    def consume_all(*keys)
      options = consume_all_extract_options(keys)
      result = consume_all_build_result(keys, options.fetch(:ostruct))
      validate if options.fetch(:validate)
      result
    end

    def validate
      return if data.empty?

      raise "Invalid keys: #{data.keys}"
    end

    def left_data
      data.dup
    end

    private

    attr_reader :data

    def consume_all_extract_options(keys)
      options = DEFAULT_OPTIONS
      options = options.merge(keys.pop.with_indifferent_access) if keys.last.is_a?(Hash)
      options
    end

    def consume_all_build_result(keys, ostruct)
      if ostruct
        ::OpenStruct.new(keys.map { |key| [key, consume(key)] }.to_h)
      else
        keys.map { |key| consume(key) }
      end
    end
  end
end

Version data entries

395 entries across 395 versions & 4 rubygems

Version Path
eac_tools-0.76.1 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.76.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.75.2 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.119.2 lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.75.1 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.75.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.119.1 lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.74.1 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.74.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.73.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.119.0 lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.72.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.118.1 lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.118.0 lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.70.1 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.70.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.69.1 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_ruby_utils-0.117.1 lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.69.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb
eac_tools-0.68.0 sub/eac_ruby_utils/lib/eac_ruby_utils/options_consumer.rb