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