class Morpheus::Cli::ErrorHandler

Public Class Methods

new(io=$stderr) click to toggle source
# File lib/morpheus/cli/error_handler.rb, line 13
def initialize(io=$stderr)
  @stderr = io
end

Public Instance Methods

format_rest_errors(errors, context=nil) click to toggle source
# File lib/morpheus/cli/error_handler.rb, line 236
def format_rest_errors(errors, context=nil)
  out = ""
  Hash(errors).each do |key, value|
    if value.is_a?(Hash)
      out << format_rest_errors(value, context ? "#{context}.#{key}" : key)
    else
      prefix = context ? (context + '.') : ''
      out << "* #{prefix}#{key}: #{value}\n"
    end
  end
  out
end
handle_error(err, options={}) click to toggle source
# File lib/morpheus/cli/error_handler.rb, line 17
def handle_error(err, options={})
  exit_code = 1
  options = (options || {}).clone
  if Morpheus::Logging.debug?
    options[:debug] = true
  end
  do_print_stacktrace = true
  
  #@stderr.puts "#{dark}Handling error #{err.class} - #{err}#{reset}"

  case (err)
  when SystemExit
    # nothing to do, assume the command that exited printed an error already
    # print "\n"
    cmdexit = err
    if cmdexit.success?
      exit_code, err = 0, nil
    else
      exit_code, err = cmdexit.status, "Command exited with status: #{cmdexit.status}"
    end
    return exit_code, err
  # when Morpheus::Cli::CommandNotFoundError
  #   puts_angry_error err.message
  #   @stderr.puts "Try help to see a list of available commands"
  #   do_print_stacktrace = false
  #   if err.exit_code
  #     exit_code = err.exit_code
  #   end
    when Morpheus::Cli::CommandAborted
      # user declined a confirmation prompt, do not print anything and exit 9
      do_print_stacktrace = false
      exit_code = err.exit_code if err.exit_code
      # err = err.message
  return 
  when ::OptionParser::InvalidOption, ::OptionParser::AmbiguousOption, 
      ::OptionParser::MissingArgument, ::OptionParser::InvalidArgument, 
      ::OptionParser::NeedlessArgument
    # raise err
    # @stderr.puts "#{red}#{err.message}#{reset}"
    puts_angry_error err.message
    @stderr.puts err.optparse.banner if err.optparse && err.optparse.banner
    @stderr.puts "Try --help for more usage information"
    do_print_stacktrace = false
    # exit_code = 127
  when Morpheus::Cli::CommandArgumentsError
    puts_angry_error err.message
    if err.args.include?("--help") || err.args.include?("--help")
      @stderr.puts err.optparse
    else
      @stderr.puts err.optparse.banner if err.optparse && err.optparse.banner
      @stderr.puts "Try --help for more usage information"
    end
    
    do_print_stacktrace = false
    if err.exit_code
      exit_code = err.exit_code
    end

  when Morpheus::Cli::CommandError
    # this should probably always print the whole thing as red, but just does the first line for now.
    # until verify_args! replaces raise_command_error where the full parser help is in the error message..
    message_lines = err.message.split(/\r?\n/)
    first_line = message_lines.shift
    puts_angry_error first_line
    if !message_lines.empty?
      @stderr.puts message_lines.join("\n") unless message_lines.empty?
    else
      if err.args.include?("--help") || err.args.include?("--help")
        @stderr.puts err.optparse
      else
        @stderr.puts err.optparse.banner if err.optparse && err.optparse.banner && message_lines.empty?
        @stderr.puts "Try --help for more usage information"
      end
    end
    do_print_stacktrace = false
    if err.exit_code
      exit_code = err.exit_code
    end
  when Morpheus::Cli::ExpressionParser::InvalidExpression
    # @stderr.puts "#{red}#{err.message}#{reset}"
    puts_angry_error err.message
    do_print_stacktrace = false
    exit_code = 99
  when SocketError
    @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
    @stderr.puts "#{red}#{err.message}#{reset}"
  when RestClient::Exceptions::Timeout
    @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
    @stderr.puts "#{red}#{err.message}#{reset}"
  when Errno::ECONNREFUSED
    @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
    @stderr.puts "#{red}#{err.message}#{reset}"
  when OpenSSL::SSL::SSLError
    @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
    @stderr.puts "#{red}#{err.message}#{reset}"
  when RestClient::Exception
    print_rest_exception(err, options)
    # no stacktrace for now...
    return exit_code, err
  when ArgumentError
    @stderr.puts "#{red}Argument Error: #{err.message}#{reset}"
  else
    @stderr.puts "#{red}Unexpected Error#{reset}"
  end

  if do_print_stacktrace
    if options[:debug]
      if err.is_a?(Exception)
        print_stacktrace(err)
      else
        @stderr.puts err.to_s
      end
    else
      @stderr.puts "Use -V or --debug for more verbose debugging information."
    end
  end

  return exit_code, err

end
print_rest_errors(response, options={}) click to toggle source
print_rest_exception(err, options) click to toggle source

def handle_rest_exception(err, io=@stderr)

if !err.is_a?(RestClient::Exception)
  raise err
end
print_rest_exception(err, io=@stderr)

end

print_rest_exception_request_and_response(e) click to toggle source
print_rest_request(req) click to toggle source
print_rest_response(res) click to toggle source
print_stacktrace(err) click to toggle source

Protected Instance Methods

puts_angry_error(*msgs) click to toggle source
# File lib/morpheus/cli/error_handler.rb, line 286
def puts_angry_error(*msgs)
  # @stderr.print "#{Term::ANSIColor.red}morpheus: #{Term::ANSIColor.reset}#{msg}\n"
  @stderr.print(Morpheus::Terminal.angry_prompt)
  @stderr.print(Term::ANSIColor.red)
  @stderr.puts(*msgs)
  @stderr.print(reset)
end