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

Instance Method Details

#contractClass<Castkit::Contract::Definition>

Returns the associated Castkit::Contract for this DataObject.

Memoizes the contract once it’s built. Uses ‘to_contract` internally.

Returns:

  • (Class<Castkit::Contract::Definition>)


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.

Examples:

UserContract = Castkit::Contract.build(:user) do
  string :id
  string :email
end

UserDto = Castkit::DataObject.from_contract(UserContract)
dto = UserDto.new(id: "abc", email: "[email protected]")

Parameters:

Returns:



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.options)
    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.

Parameters:

  • as (String, Symbol, nil) (defaults to: nil)

    Optional name for the contract. If omitted, inferred from the DataObject name.

Returns:

  • (Class<Castkit::Contract::Definition>)

    the generated or existing contract



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.

Parameters:

  • data (Hash)

    The input to validate

Returns:



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.

Parameters:

  • data (Hash)

    The input to validate

Raises:



90
91
92
# File 'lib/castkit/ext/data_object/contract.rb', line 90

def validate!(data)
  contract.validate!(data)
end