Class: Utopia::Path::Matcher
- Inherits:
-
Object
- Object
- Utopia::Path::Matcher
- Defined in:
- lib/utopia/path/matcher.rb
Defined Under Namespace
Classes: MatchData
Class Method Summary collapse
Instance Method Summary collapse
- #coerce(klass, value) ⇒ Object
-
#initialize(patterns = []) ⇒ Matcher
constructor
patterns = {key: /d+/, ‘foo’, }.
-
#match(path) ⇒ Object
This is a path prefix matching algorithm.
Constructor Details
#initialize(patterns = []) ⇒ Matcher
patterns = {key: /d+/, ‘foo’, }
45 46 47 |
# File 'lib/utopia/path/matcher.rb', line 45 def initialize(patterns = []) @patterns = patterns end |
Class Method Details
.[](patterns) ⇒ Object
49 50 51 |
# File 'lib/utopia/path/matcher.rb', line 49 def self.[](patterns) self.new(patterns) end |
Instance Method Details
#coerce(klass, value) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/utopia/path/matcher.rb', line 53 def coerce(klass, value) if klass == Integer Integer(value) elsif klass == Float Float(value) elsif klass == String value.to_s else klass.new(value) end rescue return nil end |
#match(path) ⇒ Object
This is a path prefix matching algorithm. The pattern is an array of String, Symbol, Regexp, or nil. The components is an array of String.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/utopia/path/matcher.rb', line 68 def match(path) components = path.to_a return nil if components.size < @patterns.size named_parts = {} @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 return nil end else # Ignore this part: named_parts[key] = component end end return MatchData.new(named_parts, components[@patterns.size..-1]) end |