class ReeRoda::BuildRoutingTree::RoutingTree
def add_child(value, depth, type)
def add_child(value, depth, type) new_child = self.class.new([value], depth, type, self) self.children << new_child self.children = self.children.sort { _1.values[0].match?(/\:/) ? 1 : 0 } return new_child end
def add_route(route)
def add_route(route) self.routes << route; nil end
def any_child_has_value?(value)
def any_child_has_value?(value) !!self.children.find { |c| c.values.include?(value) } end
def find_by_value(tree: self, value: nil, type: :param, depth: 0)
def find_by_value(tree: self, value: nil, type: :param, depth: 0) return tree if tree.depth == depth && tree.values.include?(value) if tree.depth < depth res = tree .children .map { find_by_value(tree: _1, value: value, type: type, depth: depth) } .flatten .compact res.size > 1 ? res : res.first end end
def get_offset(depth)
def get_offset(depth) " " * (depth + 1) * 2 end
def initialize(values, depth, type, parent = nil, routes = [])
def initialize(values, depth, type, parent = nil, routes = []) @values = values @depth = depth @parent = parent @type = type @routes = [] @children = [] end
def print_proc_tree(tree = self)
def print_proc_tree(tree = self) param_value = tree.values[0].start_with?(":") ? String : "\"#{tree.values[0]}\"" if tree.routes.length == 0 if tree.children.length > 0 puts "#{get_offset(tree.depth)}r.on #{param_value} do" tree.children.each do |child| print_proc_tree(child) end puts "#{get_offset(tree.depth)}end" end nil else if tree.children.length > 0 puts "#{get_offset(tree.depth)}r.on #{param_value} do" tree.children.each do |child| print_proc_tree(child) end puts "#{get_offset(tree.depth + 1)}r.is do" tree.routes.each do |route| puts "#{get_offset(tree.depth + 2)}r.#{route.request_method} do" puts "#{get_offset(tree.depth + 2)}end" end puts "#{get_offset(tree.depth + 1)}end" puts "#{get_offset(tree.depth)}end" else puts "#{get_offset(tree.depth)}r.is #{param_value} do" puts "#{get_offset(tree.depth + 1)}r.is do" tree.routes.each do |route| puts "#{get_offset(tree.depth + 2)}r.#{route.request_method} do" puts "#{get_offset(tree.depth + 2)}end" end puts "#{get_offset(tree.depth + 1)}end" puts "#{get_offset(tree.depth)}end" end end nil end
def print_tree(tree = self)
def print_tree(tree = self) puts "#{get_offset(tree.depth)}#{tree.values.inspect} - #{tree.depth}" if tree.children.length > 0 tree.children.each do |child| print_tree(child) end end nil end