Sha256: 28f4c8c504448ca3585639ee118f696b8f57f7e41afb250a814008f277989cd9

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true

module Rails
  module RFC6570
    class Formatter
      attr_reader :route

      def initialize(route)
        @route = route
        @parts = Visitor.new(factory: method(:symbol)).accept(route.path.spec)
      end

      def evaluate(ignore: %w[format], ctx:, **kwargs)
        parts = @parts.reject do |part|
          part.is_a?(Subst) && ignore.include?(part.name)
        end

        if kwargs.fetch(:params, true) && route
          controller = route.defaults[:controller].to_s
          action     = route.defaults[:action].to_s

          if controller.present? && action.present?
            params = ::Rails::RFC6570.params_for(controller, action)
            parts << '{?' + params.join(',') + '}' if params&.any?
          end
        end

        if kwargs.fetch(:path_only, false)
          ::Addressable::Template.new parts.join
        else
          options = ctx.url_options.merge(kwargs)
          options[:path] = parts.join

          if (osn = options.delete(:original_script_name))
            options[:script_name] = osn + options[:script_name]
          end

          ::Addressable::Template.new \
            ActionDispatch::Http::URL.url_for(options)
        end
      end

      def symbol(node, prefix: nil, suffix: nil)
        Subst.new(node.name, "{#{prefix}#{node.name}#{suffix}}")
      end

      Subst = Struct.new(:name, :to_s)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rails-rfc6570-2.4.0 lib/rails/rfc6570/formatter.rb
rails-rfc6570-2.3.0 lib/rails/rfc6570/formatter.rb