class CF::UAA::BaseCli

Attributes

global_options[RW]
input[RW]
option_defs[R]
output[R]
overview[RW]
topics[RW]

Public Class Methods

handle_bad_command(args, msg) click to toggle source
# File lib/uaa/cli/base.rb, line 239
def self.handle_bad_command(args, msg) end
preprocess_options(args, opts) click to toggle source
# File lib/uaa/cli/base.rb, line 238
def self.preprocess_options(args, opts) end
run(args = ARGV) click to toggle source
# File lib/uaa/cli/base.rb, line 241
def self.run(args = ARGV)
  @input ||= $stdin
  @output ||= $stdout
  @output.string = "" if @output.respond_to?(:string)
  args = Shellwords.split(args) if args.respond_to?(:split)
  @option_defs ||= {}
  orig = args
  @parser = OptionParser.new
  opts = @topics.each_with_object({}) do |tpc, o|
    tpc.option_defs.each do |k, optdef|
      @parser.on(*optdef) do |v|
        o[k] = (o[k] ? Array(o[k]).push(v) : v )
      end
      @option_defs[k] = optdef
    end
  end
  @parser.parse! args
  preprocess_options(args, opts)
  @topics.each do |tpc|
    tpc.commands.each do |k, v|
      next unless args[0..v[:parts].length - 1] == v[:parts]
      args = args[v[:parts].length..-1]
      if v[:argc] == -1
        # variable args, leave args alone
      elsif args.length > v[:argc]
        return handle_bad_command(orig, "Too many command line parameters given.")
      elsif args.length < v[:argc]
        (v[:argc] - args.length).times { args << nil }
      end
      opts.keys.each do |o|
        next if v[:options].include?(o) || @global_options.include?(o)
        return handle_bad_command(orig, "Invalid option: #{o}")
      end
      return tpc.new(self, opts, @input, @output).send(k, *args)
    end
  end
  @output.puts "#{File.basename($0)}: subcommand not found"
rescue Exception => e
  @output.puts "#{File.basename($0)} error", "#{e.class}: #{e.message}", (e.backtrace if opts[:trace])
ensure
  puts @output.string if opts[:trace] && @print_on_trace && @output.respond_to?(:string)
end