ProjectSource

Utopia::Path::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