-
-
Save 0x1eef/4346c7dddceefdf276a7067fda55c403 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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