module Roda::RodaPlugins::BacktrackingArray::RequestMethods
def _match_array(arg, rest)
matched, reset the state and continue to the next
elements. If the remaining elements could not be
array element match, attempt to match all remaining
When matching for a single array, after a successful
def _match_array(arg, rest) path = @remaining_path captures = @captures 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) @remaining_path = path end end false end
def match(v, rest = nil)
When matching an array, include the remaining arguments,
def match(v, rest = nil) if v.is_a?(Array) _match_array(v, rest) else super(v) end end
def match_all(args)
that if a later matcher fails, we roll back to the current
If any of the args are an array, handle backtracking such
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