80 lines
1.9 KiB
Ruby
80 lines
1.9 KiB
Ruby
module Uh
|
|
module WM
|
|
class CLI
|
|
ArgumentError = Class.new(ArgumentError)
|
|
|
|
USAGE = "Usage: #{File.basename $0} [options]".freeze
|
|
|
|
EX_USAGE = 64
|
|
EX_SOFTWARE = 70
|
|
|
|
class << self
|
|
def run arguments, stdout: $stdout, stderr: $stderr
|
|
cli = new arguments, stdout: stdout
|
|
cli.parse_arguments!
|
|
cli.run
|
|
rescue ArgumentError => e
|
|
stderr.puts e
|
|
exit EX_USAGE
|
|
rescue RuntimeError => e
|
|
stderr.puts "#{e.class.name}: #{e.message}"
|
|
stderr.puts e.backtrace.map { |e| ' %s' % e } if cli.env.debug?
|
|
exit EX_SOFTWARE
|
|
end
|
|
end
|
|
|
|
attr_reader :env
|
|
|
|
def initialize args, stdout: $stdout
|
|
@arguments = args
|
|
@env = Env.new(stdout.tap { |o| o.sync = true })
|
|
end
|
|
|
|
def parse_arguments!
|
|
option_parser.parse! @arguments
|
|
rescue OptionParser::InvalidOption => e
|
|
fail ArgumentError, option_parser
|
|
end
|
|
|
|
def run
|
|
Runner.run env
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def option_parser
|
|
OptionParser.new do |opts|
|
|
opts.banner = USAGE
|
|
opts.separator ''
|
|
opts.separator 'options:'
|
|
|
|
opts.on '-h', '--help', 'print this message' do
|
|
@env.print opts
|
|
exit
|
|
end
|
|
|
|
opts.on '-v', '--version', 'enable verbose mode' do
|
|
@env.verbose = true
|
|
@env.log_logger_level
|
|
end
|
|
|
|
opts.on '-d', '--debug', 'enable debug mode' do
|
|
@env.debug = true
|
|
@env.log_logger_level
|
|
end
|
|
|
|
opts.on '-r', '--require PATH', 'require ruby feature' do |feature|
|
|
require feature
|
|
@env.log "Loaded `#{feature}' ruby feature"
|
|
end
|
|
|
|
opts.on '-l', '--layout LAYOUT', 'specify layout' do |layout|
|
|
@env.layout_class = self.class.const_get layout.to_sym
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|