class Jisota::ParamParser

Attributes

args[R]
params[R]

Public Class Methods

new(params, args) click to toggle source
# File lib/jisota/param_parser.rb, line 5
def initialize(params, args)
  @params = params
  @args = args
end

Public Instance Methods

parse() click to toggle source
# File lib/jisota/param_parser.rb, line 10
def parse
  params_work_list = params.dup
  Hash.new.tap do |result|
    init_splat_params(result)
    add_unnamed_args(result, params_work_list)
    add_named_args(result)
    handle_remaining_params(result, params_work_list)
  end
end

Private Instance Methods

add_named_args(result) click to toggle source
# File lib/jisota/param_parser.rb, line 41
def add_named_args(result)
  named_args.each do |key, value|
    param = params.select { |p| p.name == key }.first
    raise ParameterError, "No parameter with name #{key.inspect}" unless param
    if result.has_key?(key)
      if param.splat?
        raise ParameterError, "Splat parameter #{key.inspect} only accepts unnamed arguments"
      else
        raise ParameterError, "Parameter #{key.inspect} already set with an unnamed argument"
      end
    end
    result[key] = value
  end
end
add_unnamed_args(result, params_work_list) click to toggle source
# File lib/jisota/param_parser.rb, line 28
def add_unnamed_args(result, params_work_list)
  param = nil
  unnamed_args.each do |arg|
    param = params_work_list.shift unless param && param.splat?
    raise ParameterError, "No parameter for unnamed argument #{arg}" unless param
    if param.splat?
      result[param.name] << arg
    else
      result[param.name] = arg
    end
  end
end
handle_remaining_params(result, params_work_list) click to toggle source
# File lib/jisota/param_parser.rb, line 70
def handle_remaining_params(result, params_work_list)
  params_work_list.each do |param|
    unless result.has_key?(param.name)
      if param.required? && !param.default?
        raise ParameterError, "Parameter #{param.name.inspect} is required"
      end
      result[param.name] = param.default? ? param.default : nil
    end
  end
end
init_splat_params(result) click to toggle source
# File lib/jisota/param_parser.rb, line 22
def init_splat_params(result)
  params.select(&:splat?).each do |param|
    result[param.name] = []
  end
end
named_args() click to toggle source
# File lib/jisota/param_parser.rb, line 62
def named_args
  named_args? ? args.last : {}
end
named_args?() click to toggle source
# File lib/jisota/param_parser.rb, line 66
def named_args?
  args.last.is_a?(Hash)
end
unnamed_args() click to toggle source
# File lib/jisota/param_parser.rb, line 56
def unnamed_args
  args.dup.tap do |result|
    result.pop if named_args?
  end
end