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
.validateand.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 |