module Clamp::Option::Parsing

Protected Instance Methods

parse_options() click to toggle source
# File lib/clamp/option/parsing.rb, line 8
def parse_options
  set_options_from_command_line
  default_options_from_environment
  verify_required_options_are_set
end

Private Instance Methods

default_options_from_environment() click to toggle source
# File lib/clamp/option/parsing.rb, line 47
def default_options_from_environment
  self.class.recognised_options.each do |option|
    option.of(self).default_from_environment
  end
end
find_option(switch) click to toggle source
# File lib/clamp/option/parsing.rb, line 69
def find_option(switch)
  self.class.find_option(switch) ||
    signal_usage_error(Clamp.message(:unrecognised_option, :switch => switch))
end
set_options_from_command_line() click to toggle source
# File lib/clamp/option/parsing.rb, line 16
def set_options_from_command_line
  while remaining_arguments.first && remaining_arguments.first.start_with?("-")

    switch = remaining_arguments.shift
    break if switch == "--"

    case switch
    when /\A(-\w)(.+)\z/ # combined short options
      switch = Regexp.last_match(1)
      if find_option(switch).flag?
        remaining_arguments.unshift("-" + Regexp.last_match(2))
      else
        remaining_arguments.unshift(Regexp.last_match(2))
      end
    when /\A(--[^=]+)=(.*)\z/
      switch = Regexp.last_match(1)
      remaining_arguments.unshift(Regexp.last_match(2))
    end

    option = find_option(switch)
    value = option.extract_value(switch, remaining_arguments)

    begin
      option.of(self).take(value)
    rescue ArgumentError => e
      signal_usage_error Clamp.message(:option_argument_error, :switch => switch, :message => e.message)
    end

  end
end
verify_required_options_are_set() click to toggle source
# File lib/clamp/option/parsing.rb, line 53
def verify_required_options_are_set
  self.class.recognised_options.each do |option|
    # If this option is required and the value is nil, there's an error.
    next unless option.required? && send(option.attribute_name).nil?
    if option.environment_variable
      message = Clamp.message(:option_or_env_required,
                              :option => option.switches.first,
                              :env => option.environment_variable)
    else
      message = Clamp.message(:option_required,
                              :option => option.switches.first)
    end
    signal_usage_error message
  end
end