Module: Paramore::Extension

Defined in:
lib/paramore/extension.rb

Instance Method Summary collapse

Instance Method Details

#paramorize(accessor_name, parameter_configuration) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/paramore/extension.rb', line 7

def paramorize(accessor_name, parameter_configuration)
  unless parameter_configuration.keys.size == 1
    raise ArgumentError,
      "Paramore: exactly one required attribute allowed! Given: #{param_definition.keys}"
  end

  required_parameter_name = parameter_configuration.keys.first
  types_definition = parameter_configuration.values.first

  Paramore::Validate.run(types_definition) if types_definition.is_a?(Hash)

  define_method(accessor_name) do |rails_parameters = params|
    return instance_variable_get("@#{accessor_name}") if instance_variable_defined?("@#{accessor_name}")

    permitted_parameter_argument =
      if types_definition.is_a?(Hash)
        Paramore::PermittedParameterArgument.parse(types_definition)
      else
        types_definition
      end

    permitted_params = rails_parameters
      .require(required_parameter_name)
      .permit(permitted_parameter_argument)

    parameter_values =
      if types_definition.is_a?(Hash)
        permitted_params.merge(
          Paramore::CastParameters.run(types_definition, permitted_params)
        ).permit!
      else
        permitted_params.permit!
      end

    instance_variable_set("@#{accessor_name}", parameter_values)
  end
end