class Assembler::Parameter

Attributes

name[R]
options[R]

Public Class Methods

new(name, options = {}) click to toggle source
# File lib/assembler/parameter.rb, line 5
def initialize(name, options = {})
  @name         = name.to_sym
  @options      = options
end

Public Instance Methods

name_and_aliases() click to toggle source
# File lib/assembler/parameter.rb, line 10
def name_and_aliases
  @name_and_aliases ||= [name] + aliases.map(&:to_sym)
end
value_from(hash, &if_required_and_missing) click to toggle source
# File lib/assembler/parameter.rb, line 14
def value_from(hash, &if_required_and_missing)
  @memoized_value_from ||= {}

  # NOTE: Jruby's Hash#hash implementation is BS:
  # {:foo => :foo}.hash => 1
  # {:bar => :bar}.hash => 1
  # {:foo => :foo}.to_a.hash => 806614226
  # {:bar => :bar}.to_a.hash => 3120054328
  # Go figure...
  memoization_key = hash.to_a.hash

  return @memoized_value_from[memoization_key] if @memoized_value_from[memoization_key]

  first_key = key_names.find { |name_or_alias| hash.has_key?(name_or_alias) }

  raw_value = hash.fetch(first_key) do
    options.fetch(:default) do
      if_required_and_missing.call unless if_required_and_missing.nil?

      # Returning here so we don't call coerce_value(nil)
      return
    end
  end

  @memoized_value_from[memoization_key] = coerce_value(raw_value)
end

Private Instance Methods

aliases() click to toggle source
# File lib/assembler/parameter.rb, line 75
def aliases
  @aliases ||= Array(options[:aliases]) + Array(options[:alias])
end
coerce_value(value) click to toggle source
# File lib/assembler/parameter.rb, line 63
def coerce_value(value)
  if !coercion
    value
  elsif coercion.kind_of?(Symbol)
    value.send(coercion)
  elsif coercion.respond_to?(:call)
    coercion.call(value)
  else
    raise ArgumentError, "don't know how to handle coerce value #{coercion}"
  end
end
coercion() click to toggle source
# File lib/assembler/parameter.rb, line 59
def coercion
  options[:coerce]
end
default() click to toggle source
# File lib/assembler/parameter.rb, line 55
def default
  options[:default]
end
has_default?() click to toggle source
# File lib/assembler/parameter.rb, line 51
def has_default?
  options.has_key?(:default)
end
key_names() click to toggle source
# File lib/assembler/parameter.rb, line 45
def key_names
  name_and_aliases.flat_map do |name_or_alias|
    [name_or_alias.to_sym, name_or_alias.to_s]
  end
end