lib/roda/plugins/empty_root.rb



# frozen-string-literal: true

#
class Roda
  module RodaPlugins
    # The empty_root plugin makes +r.root+ match both on +/+ and
    # on the empty string.  This is mostly useful when using multiple
    # rack applications, where the initial PATH_INFO has been moved
    # to SCRIPT_NAME.  For example, if you have the following
    # applications:
    #
    #   class App1 < Roda
    #     on "albums" do
    #       run App2
    #     end
    #   end
    #
    #   class App2 < Roda
    #     plugin :empty_root
    #
    #     route do |r|
    #       r.root do
    #         "root"
    #       end
    #     end
    #   end
    #
    # Then requests for both +/albums/+ and +/albums+ will return
    # "root".  Without this plugin loaded into App2, only requests
    # for +/albums/+ will return "root", since by default, +r.root+
    # matches only when the current PATH_INFO is +/+ and not when
    # it is empty.
    module EmptyRoot
      module RequestMethods
        # Match when the remaining path is the empty string,
        # in addition to the default behavior of matching when
        # the remaining path is +/+.
        def root(&block)
          super
          if remaining_path.empty? && is_get?
            always(&block)
          end
        end
      end
    end

    register_plugin(:empty_root, EmptyRoot)
  end
end