1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
module Slop
# This class encapsulates a Parser and Options pair. The idea is that
# the Options class shouldn't have to deal with what happens when options
# are parsed, and the Parser shouldn't have to deal with the state of
# options once parsing is complete. This keeps the API really simple; A
# Parser parses, Options handles options, and this class handles the
# result of those actions. This class contains the important most used
# methods.
class Result
attr_reader :parser, :options
def initialize(parser)
@parser = parser
@options = parser.options
end
# Returns an option's value, nil if the option does not exist.
def [](flag)
(o = option(flag)) && o.value
end
alias get []
# Returns an option's value, raises UnknownOption if the option does not exist.
def fetch(flag)
o = option(flag)
if o.nil?
cleaned_key = clean_key(flag)
raise UnknownOption.new("option not found: '#{cleaned_key}'", "#{cleaned_key}")
else
o.value
end
end
# Set the value for an option. Raises an ArgumentError if the option
# does not exist.
def []=(flag, value)
if o = option(flag)
o.value = value
else
raise ArgumentError, "no option with flag `#{flag}'"
end
end
alias set []=
# Returns an Option if it exists. Ignores any prefixed hyphens.
def option(flag)
options.find do |o|
o.flags.any? { |f| clean_key(f) == clean_key(flag) }
end
end
def method_missing(name, *args, &block)
if respond_to_missing?(name)
(o = option(name.to_s.chomp("?"))) && used_options.include?(o)
else
super
end
end
def respond_to_missing?(name, include_private = false)
name.to_s.end_with?("?") || super
end
# Returns an Array of Option instances that were used.
def used_options
parser.used_options
end
# Returns an Array of Option instances that were not used.
def unused_options
parser.unused_options
end
# Example:
#
# opts = Slop.parse do |o|
# o.string '--host'
# o.int '-p'
# end
#
# # ruby run.rb connect --host 123 helo
# opts.arguments #=> ["connect", "helo"]
#
# Returns an Array of String arguments that were not parsed.
def arguments
parser.arguments
end
alias args arguments
# Returns a hash with option key => value.
def to_hash
Hash[options.reject(&:null?).map { |o| [o.key, o.value] }]
end
alias to_h to_hash
def to_s(**opts)
options.to_s(**opts)
end
private
def clean_key(key)
key = key.to_s.sub(/\A--?/, '')
key = key.tr '-', '_' if parser.config[:underscore_flags]
key.to_sym
end
end
end
|