75 lines
1.6 KiB
Ruby
75 lines
1.6 KiB
Ruby
# encoding: UTF-8
|
|
|
|
class CustomOptionParser < OptionParser
|
|
|
|
attr_reader :symbols_used
|
|
|
|
def initialize(banner = nil, width = 32, indent = ' ' * 4)
|
|
@results = {}
|
|
@symbols_used = []
|
|
super(banner, width, indent)
|
|
end
|
|
|
|
|
|
# param Array(Array) or Array options
|
|
def add(options)
|
|
if options.is_a?(Array)
|
|
if options[0].is_a?(Array)
|
|
options.each do |option|
|
|
add_option(option)
|
|
end
|
|
else
|
|
add_option(options)
|
|
end
|
|
else
|
|
raise "Options must be at least an Array, or an Array(Array). #{options.class} supplied"
|
|
end
|
|
end
|
|
|
|
# param Array option
|
|
def add_option(option)
|
|
if option.is_a?(Array)
|
|
option_symbol = CustomOptionParser::option_to_symbol(option)
|
|
|
|
if !@symbols_used.include?(option_symbol)
|
|
@symbols_used << option_symbol
|
|
|
|
self.on(*option) do |arg|
|
|
@results[option_symbol] = arg
|
|
end
|
|
else
|
|
raise "The option #{option_symbol} is already used !"
|
|
end
|
|
else
|
|
raise "The option must be an array, #{option.class} supplied : '#{option}'"
|
|
end
|
|
end
|
|
|
|
# return Hash
|
|
def results(argv = default_argv)
|
|
self.parse!(argv) if @results.empty?
|
|
|
|
@results
|
|
end
|
|
|
|
protected
|
|
# param Array option
|
|
def self.option_to_symbol(option)
|
|
option_name = nil
|
|
|
|
option.each do |option_attr|
|
|
if option_attr =~ /^--/
|
|
option_name = option_attr
|
|
break
|
|
end
|
|
end
|
|
|
|
if option_name
|
|
option_name = option_name.gsub(/^--/, '').gsub(/-/, '_').gsub(/ .*$/, '')
|
|
:"#{option_name}"
|
|
else
|
|
raise "Could not find the option name for #{option}"
|
|
end
|
|
end
|
|
end
|