class AudioFeedManager::ArgumentsParser

Public Instance Methods

parse(specification, arguments) click to toggle source
# File lib/audio_feed_manager/cli/arguments_parser.rb, line 3
def parse(specification, arguments)
  result = Arguments.new

  result, arguments = parse_required_arguments(result, arguments, specification)
  result, arguments = parse_optional_arguments(result, arguments, specification)
  result, arguments = parse_varargs(result, arguments, specification)

  if arguments.any?
    raise InvalidArguments, "Provided #{arguments.size} extra arguments!"
  end

  result
end

Private Instance Methods

extract_arguments(result, arguments, specs) click to toggle source
# File lib/audio_feed_manager/cli/arguments_parser.rb, line 53
def extract_arguments(result, arguments, specs)
  arguments = arguments.dup

  specs.each do |arg|
    value = arguments.shift
    result.add_argument(arg.name, value)
  end

  [result, arguments]
end
parse_optional_arguments(result, arguments, specification) click to toggle source
# File lib/audio_feed_manager/cli/arguments_parser.rb, line 49
def parse_optional_arguments(result, arguments, specification)
  extract_arguments(result, arguments, specification.optional_arguments)
end
parse_required_arguments(result, arguments, specification) click to toggle source
# File lib/audio_feed_manager/cli/arguments_parser.rb, line 19
def parse_required_arguments(result, arguments, specification)
  if arguments.size < specification.required_arguments.size
    raise InvalidArguments,
      "Provided #{arguments.size} arguments, but #{specification.required_arguments.size} are required."
  end

  extract_arguments(result, arguments, specification.required_arguments)
end
parse_varargs(result, arguments, specification) click to toggle source
# File lib/audio_feed_manager/cli/arguments_parser.rb, line 28
def parse_varargs(result, arguments, specification)
  return [result, arguments] unless specification.varargs_arguments.any?

  if arguments.size < specification.minimum_varags_count
    raise InvalidArguments,
      "Provided #{arguments.size} for variable-length arguments, but #{specification.minimum_varags_count} are required."
  end

  specs = specification.varargs_arguments
  arguments = arguments.dup

  specs[0..-2].each do |arg|
    value = arguments.shift(arg.minimum)
    result.add_argument(arg.name, value)
  end

  result.add_argument(specs[-1].name, arguments)

  [result, []]
end