class Bogo::Cli::Parser::Command
Attributes
@return [Proc] callable to be executed
@return [Array<Command>] list of subcommands
@return [Array<Flag>] flags for command
@return [String] name of command
@return [OpenStruct] flag option values
@return [OptionParser] command parser
Public Class Methods
Create a new command
@param name [String, Symbol] name of command @return [Command]
# File lib/bogo-cli/parser.rb, line 115 def initialize(name) @name = name.to_sym @commands = [] @flags = [] @callable = nil @options = OptionValues.new end
Public Instance Methods
Add a new command
@param name [String, Symbol] name of command
# File lib/bogo-cli/parser.rb, line 156 def command(name, &block) Command.new(name).load(&block).tap do |c| @commands << c end end
@return [String] description of command
# File lib/bogo-cli/parser.rb, line 163 def description(v=UNSET) @description = v unless v == UNSET @description end
Generate command parsers
@param parents [Array<String,Symbol>] ancestors of command @return [Hash<string,OptParser>]
# File lib/bogo-cli/parser.rb, line 207 def generate(parents=[], add_help: true) Hash.new.tap { |cmds| @parser = OptionParser.new full_name = parents + [name] parser.program_name = full_name.join(' ') parser.banner = description unless description == UNSET if add_help parser.on('-h', '--help', "Display help information") do $stderr.puts parser.help exit end end flags.each { |f| if !f.boolean? && f.long_name.end_with?('=') short = "-#{f.short_name}" if f.short_name long = "--#{f.long_name[0, f.long_name.size - 1]} VALUE" else short = "-#{f.short_name}" if f.short_name long = "--#{f.long_name}" end parser.on(short, long, f.description, &f.callable) } commands.map { |c| c.generate(full_name, add_help: add_help) }.inject(cmds) { |memo, list| memo.merge!(list) } parser.subcommands = commands cmds[full_name.join(' ')] = self } end
@return [String] help output
# File lib/bogo-cli/parser.rb, line 180 def help parser.help end
Load a command configuration block
# File lib/bogo-cli/parser.rb, line 174 def load(&block) instance_exec(&block) self end
Add a new flag
@param short [String, Symbol] short flag @param long [String, Symbol] long flag @param description [String] description of flag @param default [String] default flag value
# File lib/bogo-cli/parser.rb, line 129 def on(short, long, description=UNSET, opts={}, &block) if short.to_s.size > 1 if description == UNSET description = long long = short short = nil elsif description.is_a?(Hash) opts = description description = long long = short short = nil end end Flag.new( short_name: short, long_name: long, description: description, default: opts[:default], callable: block, ).tap do |f| @flags << f end end
Parse the arguments
@param arguments [Array<String>] CLI arguments @return [OpenStruct, Array<String>]
# File lib/bogo-cli/parser.rb, line 188 def parse(arguments) raise "Must call #generate before #parse" if parser.nil? flags.each do |f| next if f.default.nil? options.set_default(f.option_name, f.default) end init = OpenStruct.new parser.parse!(arguments, into: init) init.each_pair do |k, v| options.assign(k, v) end [options, arguments] end
Register callable for command
# File lib/bogo-cli/parser.rb, line 169 def run(&block) @callable = block end
# File lib/bogo-cli/parser.rb, line 243 def to_hash options.to_h end