class GLI::GLIOptionParser::NormalCommandOptionParser

Public Instance Methods

parse!(parsing_result,argument_handling_strategy) click to toggle source
# File lib/flapjack/patches.rb, line 19
def parse!(parsing_result,argument_handling_strategy)
  parsed_command_options = {}
  command = parsing_result.command
  arguments = nil

  loop do
    command._action.call if command.passthrough

    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 certainly 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