Class: Methodist::Interactor
- Includes:
- Dry::Transaction
- Defined in:
- lib/methodist/interactor.rb
Overview
Methodist::Interactor
Base class for a Methodist interactor.
Methodist::Interactor dependency from dry-rb transactions and dry-rb validations
Defined Under Namespace
Classes: ContractDefinitionError, DryValidationVersionError, InputClassError, ValidatorDefinitionError
Constant Summary collapse
- NEW_DRY_VALIDATION_V =
'1.0.0'.freeze
Class Attribute Summary collapse
-
.contract_class ⇒ Object
readonly
Returns the value of attribute contract_class.
-
.input_schema ⇒ Object
readonly
Returns the value of attribute input_schema.
Instance Attribute Summary collapse
-
#validation_result ⇒ Object
Returns the value of attribute validation_result.
Class Method Summary collapse
-
.contract(contract_class: nil, &block) ⇒ Object
ATTENTION: require dry-validation >= 1.0.0 Method set Dry::Validation::Contract contract for an interactor.
-
.schema(&block) ⇒ Object
Method set Dry::Validation schema for an interactor.
Instance Method Summary collapse
-
#validate(input) ⇒ Object
Method for validation input of interactor parameters.
Methods inherited from Pattern
Class Attribute Details
.contract_class ⇒ Object (readonly)
Returns the value of attribute contract_class.
18 19 20 |
# File 'lib/methodist/interactor.rb', line 18 def contract_class @contract_class end |
.input_schema ⇒ Object (readonly)
Returns the value of attribute input_schema.
18 19 20 |
# File 'lib/methodist/interactor.rb', line 18 def input_schema @input_schema end |
Instance Attribute Details
#validation_result ⇒ Object
Returns the value of attribute validation_result.
15 16 17 |
# File 'lib/methodist/interactor.rb', line 15 def validation_result @validation_result end |
Class Method Details
.contract(contract_class: nil, &block) ⇒ Object
ATTENTION: require dry-validation >= 1.0.0 Method set Dry::Validation::Contract contract for an interactor.
Receive block for generating Dry::Validation:Contract result.
class InteractorClass < Methodist::Interactor
contract do
params do
required(:name).value(:str?)
end
rule(:name) do
...
end
end
step :validate
end
InteractorClass.new.call(name: nil) #=> Failure(ValidationError)
Or you can pass contract class:
class InteractorClass < Methodist::Interactor
contract contract_class: MyContract
step :validate
end
See
84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/methodist/interactor.rb', line 84 def contract(contract_class: nil, &block) unless new_dry_validation? raise DryValidationVersionError, "Your depended dry-validation gem version must be gteq #{NEW_DRY_VALIDATION_V}" end unless block_given? || contract_class raise ContractDefinitionError, 'You must pass block or contract_class to `contract`' end @contract_class = contract_class @contract_class ||= Class.new(Dry::Validation::Contract, &block) end |
.schema(&block) ⇒ Object
Method set Dry::Validation schema for an interactor.
Receive block for generating Dry::Validation schema result.
class InteractorClass < Methodist::Interactor
schema do
required(:name).value(:str?)
end
step :validate
end
InteractorClass.new.call(name: nil) #=> Failure(ValidationError)
See
41 42 43 44 45 46 47 |
# File 'lib/methodist/interactor.rb', line 41 def schema(&block) if block_given? @input_schema = dry_schema(&block) else raise SchemaDefinitionError, 'You must pass block to `schema`' end end |
Instance Method Details
#validate(input) ⇒ Object
Method for validation input of interactor parameters.
Parameters
-
input
[Hash] - parameters for interactor
Example
# app/interactors/interactor_class.rb
class InteractorClass < Methodist::Interactor
schema do
required(:name).value(:str?)
end
step :validate
end
# your controller action
def create
result = InteractorClass.new.call(name: nil) #=> Failure(ValidationError)
raise InteractorError, result.value if result.failure?
end
Return
-
Dry::Monads::Result::Success
- success result of interactor step -
Dry::Monads::Result::Failure
- failure result of interactor step
Raise
-
SchemaDefinitionError
- raise if method was called without a schema definition
Attention
You can redefine failure_validation_value for a custom value returning in case of validation Failure
145 146 147 148 149 150 151 152 153 |
# File 'lib/methodist/interactor.rb', line 145 def validate(input) input = {} unless input raise InputClassError, 'If you want to use custom #validate, you have to pass a hash to an interactor' unless input.is_a?(Hash) validator = contract_class ? contract_class : input_schema raise ValidatorDefinitionError, 'you must define schema via #schema OR define contract via #contract' unless validator @validation_result = validator.call(input) return Success(validation_result.to_h) if validation_result.success? Failure(failure_validation_value) end |