Class: WaterDrop::Contractable::Contract
- Inherits:
-
Object
- Object
- WaterDrop::Contractable::Contract
- Extended by:
- WaterDrop::Configurable
- Defined in:
- lib/waterdrop/contractable/contract.rb
Overview
Note:
This contract does NOT support rules inheritance as it was never needed in Karafka
Base contract for all the contracts that check data format
Direct Known Subclasses
Class Attribute Summary collapse
-
.rules ⇒ Array<Rule>
readonly
All the validation rules defined for a given contract.
Class Method Summary collapse
-
.nested(path, &block) ⇒ Object
Allows for definition of a scope/namespace for nested validations.
- .optional(*keys, &block) ⇒ Object
-
.required(*keys, &block) ⇒ Object
Defines a rule for a required field (required means, that will automatically create an error if missing).
- .virtual(&block) ⇒ Object
Instance Method Summary collapse
-
#call(data) ⇒ Result
Runs the validation.
-
#validate!(data, error_class) ⇒ Boolean
True.
Methods included from WaterDrop::Configurable
Class Attribute Details
.rules ⇒ Array<Rule> (readonly)
Returns all the validation rules defined for a given contract.
17 18 19 |
# File 'lib/waterdrop/contractable/contract.rb', line 17 def rules @rules end |
Class Method Details
.nested(path, &block) ⇒ Object
Allows for definition of a scope/namespace for nested validations
28 29 30 31 32 33 |
# File 'lib/waterdrop/contractable/contract.rb', line 28 def nested(path, &block) init_accu @nested << path instance_eval(&block) @nested.pop end |
.optional(*keys, &block) ⇒ Object
47 48 49 50 |
# File 'lib/waterdrop/contractable/contract.rb', line 47 def optional(*keys, &block) init_accu @rules << Rule.new(@nested + keys, :optional, block).freeze end |
.required(*keys, &block) ⇒ Object
Defines a rule for a required field (required means, that will automatically create an error if missing)
40 41 42 43 |
# File 'lib/waterdrop/contractable/contract.rb', line 40 def required(*keys, &block) init_accu @rules << Rule.new(@nested + keys, :required, block).freeze end |
.virtual(&block) ⇒ Object
Note:
Virtual rules have different result expectations. Please see contracts or specs for details.
56 57 58 59 |
# File 'lib/waterdrop/contractable/contract.rb', line 56 def virtual(&block) init_accu @rules << Rule.new([], :virtual, block).freeze end |
Instance Method Details
#call(data) ⇒ Result
Runs the validation
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/waterdrop/contractable/contract.rb', line 74 def call(data) errors = [] self.class.rules.map do |rule| case rule.type when :required validate_required(data, rule, errors) when :optional validate_optional(data, rule, errors) when :virtual validate_virtual(data, rule, errors) end end Result.new(errors, self) end |
#validate!(data, error_class) ⇒ Boolean
Returns true.
96 97 98 99 100 101 102 |
# File 'lib/waterdrop/contractable/contract.rb', line 96 def validate!(data, error_class) result = call(data) return true if result.success? raise error_class, result.errors end |