Skip to content

Instantly share code, notes, and snippets.

@0x1eef

0x1eef/cmd.rb Secret

Last active January 6, 2024 20:07
Show Gist options
  • Save 0x1eef/4346c7dddceefdf276a7067fda55c403 to your computer and use it in GitHub Desktop.
Save 0x1eef/4346c7dddceefdf276a7067fda55c403 to your computer and use it in GitHub Desktop.
# frozen_string_literal: true
require "optparse"
require "ryo"
module Cmd::OptionParser
def self.included(klass)
klass.extend(ClassMethods)
end
module ClassMethods
def set_banner(banner)
option_parser.banner = banner
end
def set_option(short, long, desc)
option_parser.on(short, long, desc)
end
def set_default(defaults)
@defaults = Ryo.from(defaults)
end
def option_parser
@option_parser ||= ::OptionParser.new(nil, 26, " " * 2)
end
def defaults
@defaults || {}
end
end
def parse!(argv)
options = Ryo.from(self.class.defaults)
option_parser.on("-h", "--help", "Show help") { options.h = options.help = true }
option_parser.parse(argv, into: options)
options
end
def option_parser
self.class.option_parser
end
end
class Cmd
include Cmd::OptionParser
attr_reader :argv
def initialize(argv)
@argv = argv
end
end
class Gzip < Cmd
set_banner "gzip [OPTIONS]"
set_option "-l=LEVEL", "--level=LEVEL", "Level of compression"
set_default level: 5
def run(argv)
options = parse!(argv)
if options.help
puts option_parser.help
exit
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment