class Matcher
Performs structured, efficient, matches against class Utopia::Path
instances. Supports regular expressions, type-casts and constants.
path = Utopia::Path['users/20/edit']
matcher = Utopia::Path::Matcher[users: /users/, id: Integer, action: String]
match_data = matcher.match(path)
Nested
Definitions
def initialize(patterns = [])
Implementation
def initialize(patterns = [])
@patterns = patterns
end
def match(path)
This is a path prefix matching algorithm. The pattern is an array of String, Symbol, Regexp, or nil. The path is an array of String.
Implementation
def match(path)
components = path.to_a
# Can't possibly match if not enough components:
return nil if components.size < @patterns.size
named_parts = {}
# Try to match each component against the pattern:
@patterns.each_with_index do |(key, pattern), index|
component = components[index]
if pattern.is_a? Class
return nil unless value = coerce(pattern, component)
named_parts[key] = value
elsif pattern
if result = pattern.match(component)
named_parts[key] = result
else
# Couldn't match:
return nil
end
else
# Ignore this part:
named_parts[key] = component
end
end
return MatchData.new(named_parts, components[@patterns.size..-1])
end