module Roda::RodaPlugins::BacktrackingArray::RequestMethods
def _match_array(arg, rest=nil)
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=nil) return super unless rest unless path = @remaining_path e = @env script = e[SCRIPT_NAME] path = e[PATH_INFO] end 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) if @remaining_path @remaining_path = path else e[SCRIPT_NAME] = script e[PATH_INFO] = path end 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