class Envo::CliParser
Public Class Methods
filter_opts(args)
click to toggle source
# File lib/envo/cli_parser.rb, line 16 def self.filter_opts(args) filter_opts_front(args) + filter_opts_back(args) end
filter_opts_back(args)
click to toggle source
# File lib/envo/cli_parser.rb, line 11 def self.filter_opts_back(args) back_opts = args.reverse.take_while { |a| opt?(a) }.reverse args.pop(back_opts.size) back_opts end
filter_opts_front(args)
click to toggle source
# File lib/envo/cli_parser.rb, line 6 def self.filter_opts_front(args) front_opts = args.take_while { |a| opt?(a) } args.shift(front_opts.size) front_opts end
new(opts)
click to toggle source
# File lib/envo/cli_parser.rb, line 19 def initialize(opts) @known_cmds = {} @known_opts = opts end
opt?(opt)
click to toggle source
# File lib/envo/cli_parser.rb, line 3 def self.opt?(opt) opt =~ /^-/ end
Public Instance Methods
add_cmd(name, parse_func)
click to toggle source
# File lib/envo/cli_parser.rb, line 23 def add_cmd(name, parse_func) raise Envo::Error "cmd #{name} is already added to parser" if @known_cmds[name] @known_cmds[name] = parse_func end
parse(argv)
click to toggle source
# File lib/envo/cli_parser.rb, line 27 def parse(argv) result = ParseResult.new cmd = nil while !argv.empty? arg = argv.shift if CliParser.opt?(arg) result.opts.merge! @known_opts.parse_cli(arg) else break cmd = arg end end raise Envo::Error.new 'missing command' if !cmd raise Envo::Error.new "unknown command '#{cmd}'" if !@known_cmds[cmd] parsed_cmd = @known_cmds[cmd].(cmd, argv) cmd_opts = {} parsed_cmd.opts.each do |opt| cmd_opts.merge! @known_opts.parse_cli(opt) end parsed_cmd.opts = cmd_opts result.cmds << parsed_cmd result end