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