Sha256: 9b811c383758eaadf26fb74f6a66813da6314ad958e96d03d0a75302fcb7bc42

Contents?: true

Size: 1.19 KB

Versions: 4

Compression:

Stored size: 1.19 KB

Contents

# frozen_string_literal: true

require_relative "./node"

module Hanami
  module Middleware
    # Trie to register scopes with custom Rack middleware
    #
    # @api private
    # @since 2.0.0
    class Trie
      # @api private
      # @since 2.0.0
      def initialize(app)
        @app = app
        @root = Node.new
      end

      # @api private
      # @since 2.0.0
      def freeze
        @root.freeze
        super
      end

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

        node.app!(app)
      end

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

        for_each_segment(path) do |segment|
          break unless node

          node = node.get(segment)
        end

        return node.app if node&.app?

        @root.app || @app
      end

      # @api private
      # @since 2.0.0
      def empty?
        @root.leaf?
      end

      private

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

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
hanami-router-2.0.2 lib/hanami/middleware/trie.rb
hanami-router-2.0.1 lib/hanami/middleware/trie.rb
hanami-router-2.0.0 lib/hanami/middleware/trie.rb
hanami-router-2.0.0.rc1 lib/hanami/middleware/trie.rb