Module: DriedInteraction::InstanceMethods

Defined in:
lib/dried_interaction/instance_methods.rb

Instance Method Summary collapse

Instance Method Details

#call(*args) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/dried_interaction/instance_methods.rb', line 10

def call(*args)
  interaction_contract_error('Call method allows only one argument') if args.size != 1
  arg = args.first

  contract = self.class.contract_validator
  interaction_contract_error('Contract must be filled') if arg && !contract

  contract_params = fetch_contract_params(contract)
  check_result = check_params_presence_in_args(contract_params, arg.keys)
  return check_result if check_result&.failure?

  contract_result = contract.(arg)
  return interaction_contract_error(contract_result.errors) if contract_result.failure?

  super(arg)
end

#check_params_presence_in_args(contract_params, args_params) ⇒ Object



27
28
29
30
31
32
# File 'lib/dried_interaction/instance_methods.rb', line 27

def check_params_presence_in_args(contract_params, args_params)
  missed_params = args_params - contract_params
  return if missed_params.empty?

  interaction_contract_error("Params (#{missed_params}) are not present in contract")
end

#fetch_contract_params(contract) ⇒ Object



34
35
36
37
38
# File 'lib/dried_interaction/instance_methods.rb', line 34

def fetch_contract_params(contract)
  schema = contract.is_a?(Dry::Schema::Params) ? contract : contract.schema

  schema.key_map.keys.map { |key| key.name.to_sym }
end

#interaction_contract_error(msgs) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/dried_interaction/instance_methods.rb', line 40

def interaction_contract_error(msgs)
  error = DriedInteractionError.new(class: self.class.to_s, errors: msgs)

  case self.class.contract_mode
  when :strict
    raise error
  when :soft
    Failure(error)
  else
    raise ArgumentError
  end
end