class GLI::GLIOptionParser::NormalCommandOptionParser

Public Class Methods

new(accepts) click to toggle source
# File lib/gli/gli_option_parser.rb, line 110
def initialize(accepts)
  @accepts = accepts
end

Public Instance Methods

error_handler() click to toggle source
# File lib/gli/gli_option_parser.rb, line 114
def error_handler
  lambda { |message,extra_error_context|
    raise UnknownCommandArgument.new(message,extra_error_context)
  }
end
parse!(parsing_result,argument_handling_strategy) click to toggle source
# File lib/gli/gli_option_parser.rb, line 120
def parse!(parsing_result,argument_handling_strategy)
  parsed_command_options = {}
  command = parsing_result.command
  arguments = nil

  loop do
    option_parser_factory       = OptionParserFactory.for_command(command,@accepts)
    option_block_parser         = CommandOptionBlockParser.new(option_parser_factory, self.error_handler)
    option_block_parser.command = command
    arguments                   = parsing_result.arguments

    arguments = option_block_parser.parse!(arguments)

    parsed_command_options[command] = option_parser_factory.options_hash_with_defaults_set!
    command_finder                  = CommandFinder.new(command.commands, :default_command => command.get_default_command)
    next_command_name               = arguments.shift

    verify_required_options!(command.flags, command, parsed_command_options[command])

    begin
      command = command_finder.find_command(next_command_name)
    rescue AmbiguousCommand
      arguments.unshift(next_command_name)
      break
    rescue UnknownCommand
      arguments.unshift(next_command_name)
      # Although command finder could certainy know if it should use
      # the default command, it has no way to put the "unknown command"
      # back into the argument stack.  UGH.
      unless command.get_default_command.nil?
        command = command_finder.find_command(command.get_default_command)
      end
      break
    end
  end
  parsed_command_options[command] ||= {}
  command_options = parsed_command_options[command]

  this_command          = command.parent
  child_command_options = command_options

  while this_command.kind_of?(command.class)
    this_command_options = parsed_command_options[this_command] || {}
    child_command_options[GLI::Command::PARENT] = this_command_options
    this_command = this_command.parent
    child_command_options = this_command_options
  end

  parsing_result.command_options = command_options
  parsing_result.command = command
  parsing_result.arguments = Array(arguments.compact)

  # Lets validate the arguments now that we know for sure the command that is invoked
  verify_arguments!(parsing_result.arguments, parsing_result.command) if argument_handling_strategy == :strict

  parsing_result
end