Skip to content

Instantly share code, notes, and snippets.

@felipec
Last active May 26, 2021 20:29
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save felipec/6772110 to your computer and use it in GitHub Desktop.
Simple option parser
# This is now a gem
# https://rubygems.org/gems/parseopt
class ParseOpt
class Option
attr_reader :short, :long, :help
def initialize(short, long, help, &block)
@block = block
@short = short
@long = long
@help = help
end
def call(v)
@block.call(v) || true
end
end
private_constant :Option
def initialize(usage = nil)
@list = {}
@usage = usage
yield self if block_given?
end
def on(short, long = nil, help = nil, &block)
opt = Option.new(short, long, help, &block)
@list[short] = opt if short
@list[long] = opt if long
end
def parse(args = ARGV)
if args.member?('-h') or args.member?('--help')
usage
exit 0
end
seen_dash = false
args.delete_if do |cur|
opt = val = nil
next false if cur[0] != '-' or seen_dash
case cur
when '--'
seen_dash = true
next true
when /^--no-(.+)$/
opt = @list[$1]
val = false
when /^-([^-])(.+)?$/, /^--(.+?)(?:=(.+))?$/
opt = @list[$1]
val = $2 || true
end
opt&.call(val)
end
end
def usage=(value)
@usage = value
end
def usage
puts 'usage: %s' % @usage
@list.values.uniq.each do |opt|
s = ' '
s << ''
s << [opt.short&.prepend('-'), opt.long&.prepend('--')].compact.join(', ')
s << ''
s << '%*s%s' % [26 - s.size, '', opt.help] if opt.help
puts s
end
end
end
$str = 'default'
$num = 0
$bool = false
opts = ParseOpt.new
opts.usage = 'git foo'
opts.on('b', 'bool', 'Boolean') do |v|
$bool = v
end
opts.on('s', 'string', 'String') do |v|
$str = v
end
opts.on('n', 'number', 'Number') do |v|
$num = v.to_i
end
opts.parse
@skyeagle
Copy link

Really nice and usefull. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment