Module: Castkit::Contract

Defined in:
lib/castkit/contract.rb,
lib/castkit/contract/base.rb,
lib/castkit/contract/result.rb,
lib/castkit/contract/validator.rb,
lib/castkit/contract/data_object.rb

Overview

Castkit::Contract provides a lightweight mechanism for defining and validating structured input using a DSL similar to Castkit::DataObject, but without requiring a full data model. Contracts are ideal for validating operation inputs, service payloads, or external API request data.

Contracts support primitive type coercion, nested data object validation, and configurable strictness for unknown attributes. Each contract is defined as a standalone class with its own rules and validation logic.

Defined Under Namespace

Modules: DataObject Classes: Base, Result, Validator

Class Method Summary collapse

Class Method Details

.build(name = nil, **validation_rules) { ... } ⇒ Class<Castkit::Contract::Base>

Builds a contract from a DSL block and optional validation rules.

Examples:

Using a block to define a contract

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

UserContract.validate!(id: "abc") # => passes

With custom validation rules

LooseContract = Castkit::Contract.build(:loose, strict: false) do
  string :token
end

Parameters:

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

    Optional name for the contract.

  • validation_rules (Hash)

    Optional validation rules (e.g., ‘strict: true`).

Yields:

  • Optional DSL block to define attributes.

Returns:



35
36
37
38
39
40
# File 'lib/castkit/contract.rb', line 35

def build(name = nil, **validation_rules, &block)
  klass = Class.new(Castkit::Contract::Base)
  klass.send(:define, name, nil, validation_rules: validation_rules, &block)

  klass
end

.from_dataobject(source, as: nil) ⇒ Class<Castkit::Contract::Base>

Builds a contract from an existing Castkit::DataObject class.

Examples:

Generating a contract from a DTO

class UserDto < Castkit::DataObject
  string :id
  string :email
end

UserContract = Castkit::Contract.from_dataobject(UserDto)
UserContract.validate!(id: "123", email: "[email protected]")

Parameters:

  • source (Class<Castkit::DataObject>)

    the DataObject to generate the contract from

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

    Optional custom name to use for the contract

Returns:



56
57
58
59
60
61
62
63
64
# File 'lib/castkit/contract.rb', line 56

def from_dataobject(source, as: nil)
  name = as || Castkit::Inflector.unqualified_name(source)
  name = Castkit::Inflector.underscore(name).to_sym

  klass = Class.new(Castkit::Contract::Base)
  klass.send(:define, name, source, validation_rules: source.validation_rules)

  klass
end