Module: Castkit::Ext::DataObject::Contract
- Included in:
- DataObject
- Defined in:
- lib/castkit/ext/data_object/contract.rb
Overview
Extension module that adds contract support to Castkit::DataObject classes.
This allows any DataObject to be:
-
Converted into a contract definition (via ‘.to_contract`)
-
Validated against its contract (via ‘.validate` and `.validate!`)
-
Reconstructed from a contract class (via ‘.from_contract`)
Example:
class UserDto < Castkit::DataObject
string :id
string :email
end
contract = UserDto.to_contract
result = UserDto.validate(id: "abc")
UserDto.from_contract(contract) # => builds an equivalent DataObject class
This module is automatically extended by Castkit::DataObject and is not intended to be included manually.
Instance Method Summary collapse
-
#contract ⇒ Class<Castkit::Contract::Definition>
Returns the associated Castkit::Contract for this DataObject.
-
#from_contract(contract) ⇒ Class<Castkit::DataObject>
Constructs a new Castkit::DataObject class from a given contract.
-
#to_contract(as: nil) ⇒ Class<Castkit::Contract::Definition>
Converts the current DataObject into a Castkit::Contract subclass.
-
#validate(data) ⇒ Castkit::Contract::Result
Validates input data using the contract associated with this DataObject.
-
#validate!(data) ⇒ void
Validates input data and raises if validation fails.
Instance Method Details
#contract ⇒ Class<Castkit::Contract::Definition>
Returns the associated Castkit::Contract for this DataObject.
Memoizes the contract once it’s built. Uses ‘to_contract` internally.
35 36 37 |
# File 'lib/castkit/ext/data_object/contract.rb', line 35 def contract @contract ||= to_contract end |
#from_contract(contract) ⇒ Class<Castkit::DataObject>
Constructs a new Castkit::DataObject class from a given contract.
This method is the inverse of ‘.to_contract` and provides a way to generate a DataObject from an existing contract definition.
69 70 71 72 73 74 75 |
# File 'lib/castkit/ext/data_object/contract.rb', line 69 def from_contract(contract) Class.new(Castkit::DataObject).tap do |klass| contract.attributes.each_value do |attr| klass.attribute(attr.field, attr.type, **attr.) end end end |
#to_contract(as: nil) ⇒ Class<Castkit::Contract::Definition>
Converts the current DataObject into a Castkit::Contract subclass.
If the contract has already been defined, returns the existing definition. Otherwise, generates and registers a new contract class under Castkit::Contracts.
48 49 50 |
# File 'lib/castkit/ext/data_object/contract.rb', line 48 def to_contract(as: nil) Castkit::Contract.from_dataobject(self, as: as) end |
#validate(data) ⇒ Castkit::Contract::Result
Validates input data using the contract associated with this DataObject.
81 82 83 |
# File 'lib/castkit/ext/data_object/contract.rb', line 81 def validate(data) contract.validate(data) end |
#validate!(data) ⇒ void
This method returns an undefined value.
Validates input data and raises if validation fails.
90 91 92 |
# File 'lib/castkit/ext/data_object/contract.rb', line 90 def validate!(data) contract.validate!(data) end |