class Bogo::Cli::Parser::Command

Attributes

callable[R]

@return [Proc] callable to be executed

commands[R]

@return [Array<Command>] list of subcommands

flags[R]

@return [Array<Flag>] flags for command

name[R]

@return [String] name of command

options[R]

@return [OpenStruct] flag option values

parser[R]

@return [OptionParser] command parser

Public Class Methods

new(name) click to toggle source

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

command(name, &block) click to toggle source

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
description(v=UNSET) click to toggle source

@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(parents=[], add_help: true) click to toggle source

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
help() click to toggle source

@return [String] help output

# File lib/bogo-cli/parser.rb, line 180
def help
  parser.help
end
load(&block) click to toggle source

Load a command configuration block

# File lib/bogo-cli/parser.rb, line 174
def load(&block)
  instance_exec(&block)
  self
end
on(short, long, description=UNSET, opts={}, &block) click to toggle source

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(arguments) click to toggle source

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
run(&block) click to toggle source

Register callable for command

# File lib/bogo-cli/parser.rb, line 169
def run(&block)
  @callable = block
end
to_hash() click to toggle source
# File lib/bogo-cli/parser.rb, line 243
def to_hash
  options.to_h
end