diff --git a/lib/yawpa.rb b/lib/yawpa.rb index 6507372..431aefb 100644 --- a/lib/yawpa.rb +++ b/lib/yawpa.rb @@ -13,44 +13,34 @@ module Yawpa module_function def parse(params, options) + options = _massage_options(options) opts = {} args = [] i = 0 while i < params.length param = params[i] - if param =~ /^(--?)([^=]+)(?:=(.+))?$/ - leader, param_name, val = $1, $2, $3 - case leader.length - when 2 - param_key = if options[param_name] - param_name - elsif options[param_name.to_sym] - param_name.to_sym - else - nil - end - if param_key.nil? - raise UnknownOptionException.new("Unknown option '#{param_name}'") + if param =~ /^--([^=]+)(?:=(.+))?$/ + param_name, val = $1, $2 + if options[param_name].nil? + raise UnknownOptionException.new("Unknown option '#{param_name}'") + end + opt_config = options[param_name] + param_key = opt_config[:key] + if opt_config[:nargs].last == 0 + opts[param_key] = true + else + opts[param_key] = [] + opts[param_key] << val if val + if opts[param_key].length < opt_config[:nargs].last + gathered = _gather(i + 1, opt_config[:nargs].last - opts[param_key].length, params) + i += gathered.length + opts[param_key] += gathered + if opts[param_key].length < opt_config[:nargs].first + raise InvalidArgumentsException.new("Not enough arguments supplied for option '#{param_name}'") + end end - opt_config = options[param_key] - nargs = opt_config[:nargs] || 0 - if nargs == 0 - opts[param_key] = true - else - nargs = (nargs..nargs) if nargs.class == Fixnum - opts[param_key] = [] - opts[param_key] << val if val - if opts[param_key].length < nargs.last - gathered = _gather(i + 1, nargs.last - opts[param_key].length, params) - i += gathered.length - opts[param_key] += gathered - if opts[param_key].length < nargs.first - raise InvalidArgumentsException.new("Not enough arguments supplied for option '#{param_name}'") - end - end - if opts[param_key].length == 1 - opts[param_key] = opts[param_key].first - end + if opts[param_key].length == 1 + opts[param_key] = opts[param_key].first end end else @@ -73,4 +63,16 @@ module Yawpa end result end + + def _massage_options(options) + {}.tap do |newopts| + options.each_pair do |k, v| + newkey = k.to_s + newopts[newkey] = {key: k} + nargs = v[:nargs] || 0 + nargs = (nargs..nargs) if nargs.class == Fixnum + newopts[newkey][:nargs] = nargs + end + end + end end