module Roda::RodaPlugins::BacktrackingArray::RequestMethods

Constants

PATH_INFO
SCRIPT_NAME

Private Instance Methods

_match_array(arg, rest=nil) click to toggle source

When matching for a single array, after a successful array element match, attempt to match all remaining elements. If the remaining elements could not be matched, reset the state and continue to the next entry in the array.

Calls superclass method
# File lib/roda/plugins/backtracking_array.rb, line 36
def _match_array(arg, rest=nil)
  return super unless rest
  env = @env

  script = env[SCRIPT_NAME]
  path = env[PATH_INFO]
  caps = captures.dup
  arg.each do |v|
    if match(v, rest)
      if v.is_a?(String)
        captures.push(v)
      end

      if match_all(rest)
        return true
      end

      # Matching all remaining elements failed, reset state
      captures.replace(caps)
      env[SCRIPT_NAME] = script
      env[PATH_INFO] = path
    end
  end
  false
end
match(v, rest = nil) click to toggle source

When matching an array, include the remaining arguments, otherwise, just match the single argument.

Calls superclass method
# File lib/roda/plugins/backtracking_array.rb, line 80
def match(v, rest = nil)
  if v.is_a?(Array)
    _match_array(v, rest)
  else
    super(v)
  end
end
match_all(args) click to toggle source

If any of the args are an array, handle backtracking such that if a later matcher fails, we roll back to the current matcher and proceed to the next entry in the array.

# File lib/roda/plugins/backtracking_array.rb, line 65
def match_all(args)
  args = args.dup
  until args.empty?
    arg = args.shift
    if match(arg, args)
      return true if arg.is_a?(Array)
    else
      return
    end
  end
  true
end