require 'lotus/utils/hash' module Lotus module Action # A set of params requested by the client # # It's able to extract the relevant params from a Rack env of from an Hash. # # There are three scenarios: # * When used with Lotus::Router: it contains only the params from the request # * When used standalone: it contains all the Rack env # * Default: it returns the given hash as it is. It's useful for testing purposes. # # @since 0.1.0 class Params < Utils::Hash # The key that returns raw input from the Rack env # # @since 0.1.0 RACK_INPUT = 'rack.input'.freeze # The key that returns router params from the Rack env # This is a builtin integration for Lotus::Router # # @since 0.1.0 ROUTER_PARAMS = 'router.params'.freeze # Initialize the params and freeze them. # # @param env [Hash] a Rack env or an hash of params. # # @return [Params] # # @since 0.1.0 def initialize(env) super _extract(env) symbolize! freeze end private def _extract(env) {}.tap do |result| if env.has_key?(RACK_INPUT) result.merge! ::Rack::Request.new(env).params result.merge! env.fetch(ROUTER_PARAMS, {}) else result.merge! env.fetch(ROUTER_PARAMS, env) end end end end end end