class RubyRoutesTrie::Trie
Public Class Methods
new()
click to toggle source
# File lib/trie/trie.rb, line 8 def initialize @root = Node.new("/") end
Public Instance Methods
add_route(method, route)
click to toggle source
# File lib/trie/trie.rb, line 12 def add_route(method, route) levels = levels_split(route) raise RouteMustBeUnique if valid?(levels) base = @root levels.each { |level| base = add_attributes(level, base.children) } base.method = method base.route = route end
find(route)
click to toggle source
# File lib/trie/trie.rb, line 23 def find(route) find_route(route) do |found, base| raise RouteNotExist if !found || base.route.empty? end end
Private Instance Methods
add_attributes(value, trie)
click to toggle source
# File lib/trie/trie.rb, line 39 def add_attributes(value, trie) trie.find {|n| n.value == value} || add_node(value, trie) end
add_node(value, trie)
click to toggle source
# File lib/trie/trie.rb, line 43 def add_node(value, trie) Node.new(value).tap { |new_node| trie << new_node } end
find_attributes(value, trie, dynamic_value)
click to toggle source
# File lib/trie/trie.rb, line 61 def find_attributes(value, trie, dynamic_value) trie.sort_by{ |n| n.type }.find do |n| if n.dynamic? dynamic_value[n.value] = value true else n.value == value end end end
find_route(route) { |route_found, base| ... }
click to toggle source
# File lib/trie/trie.rb, line 47 def find_route(route) levels = levels_split(route) base = @root dynamic_value = {} route_found = levels.all? { |level| base = find_attributes(level, base.children, dynamic_value) } yield route_found, base if block_given? response(base.method, base.route, dynamic_value) end
levels_split(route)
click to toggle source
# File lib/trie/trie.rb, line 31 def levels_split(route) route.split('/').reject { |e| e.to_s.empty? } end
response(method, route, dynamic_value)
click to toggle source
# File lib/trie/trie.rb, line 57 def response(method, route, dynamic_value) Response.new(method, route, dynamic_value) end
valid?(levels)
click to toggle source
# File lib/trie/trie.rb, line 35 def valid?(levels) levels.find_all {|level| levels.count(level) > 1}.any? end