Sha256: 998f8a66cc18d1bfeef8529f44fe946a321a28ea6dca6b64a329cb44a9e394de

Contents?: true

Size: 1.27 KB

Versions: 15

Compression:

Stored size: 1.27 KB

Contents

# frozen_string_literal: true

require "hanami/router/node"

module Hanami
  class Router
    # Trie data structure to store routes
    #
    # @api private
    # @since 2.0.0
    class Trie
      # @api private
      # @since 2.0.0
      attr_reader :root

      # @api private
      # @since 2.0.0
      def initialize
        @root = Node.new
      end

      # @api private
      # @since 2.0.0
      def add(path, to, constraints)
        node = @root
        for_each_segment(path) do |segment|
          node = node.put(segment, constraints)
        end

        node.leaf!(to)
      end

      # @api private
      # @since 2.0.0
      def find(path)
        node = @root
        params = {}

        for_each_segment(path) do |segment|
          break unless node

          child, captures = node.get(segment)
          params.merge!(captures) if captures

          node = child
        end

        return [node.to, params] if node&.leaf?

        nil
      end

      private

      # @api private
      # @since 2.0.0
      SEGMENT_SEPARATOR = /\//
      private_constant :SEGMENT_SEPARATOR

      # @api private
      # @since 2.0.0
      def for_each_segment(path, &blk)
        _, *segments = path.split(SEGMENT_SEPARATOR)
        segments.each(&blk)
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
hanami-router-2.2.0.rc1 lib/hanami/router/trie.rb
hanami-router-2.2.0.beta2 lib/hanami/router/trie.rb
hanami-router-2.2.0.beta1 lib/hanami/router/trie.rb
hanami-router-2.1.0 lib/hanami/router/trie.rb
hanami-router-2.1.0.rc3 lib/hanami/router/trie.rb
hanami-router-2.1.0.rc2 lib/hanami/router/trie.rb
hanami-router-2.1.0.rc1 lib/hanami/router/trie.rb
hanami-router-2.1.0.beta1 lib/hanami/router/trie.rb
hanami-router-2.0.2 lib/hanami/router/trie.rb
hanami-router-2.0.1 lib/hanami/router/trie.rb
hanami-router-2.0.0 lib/hanami/router/trie.rb
hanami-router-2.0.0.rc1 lib/hanami/router/trie.rb
hanami-router-2.0.0.beta4 lib/hanami/router/trie.rb
hanami-router-2.0.0.beta2 lib/hanami/router/trie.rb
hanami-router-2.0.0.beta1 lib/hanami/router/trie.rb