Class: Castkit::Contract::Base

Inherits:
Object
  • Object
show all
Extended by:
Castkit::Core::AttributeTypes, Castkit::Core::Config, Cattri
Defined in:
lib/castkit/contract/base.rb

Overview

Base class for all Castkit contracts.

Castkit contracts define validation logic over a set of attributes using a DSL. You can either subclass this directly or use build to generate ephemeral or reusable contract classes.

Examples:

Subclassing directly

class MyContract < Castkit::Contract::Base
  string :id
  integer :count, required: false
end

MyContract.validate!(id: "abc")

Using Contract.build (preferred for dynamic generation)

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

UserContract.validate!(id: "123")

See Also:

Constant Summary collapse

ATTRIBUTE_OPTIONS =
i[
  required aliases min max format of validator unwrapped prefix force_type
].freeze

Class Method Summary collapse

Methods included from Castkit::Core::Config

allow_unknown, extended, ignore_unknown, relaxed, strict, validation_rules, warn_on_unknown

Methods included from Castkit::Core::AttributeTypes

array, boolean, dataobject, date, datetime, define_type_dsl, float, hash, included, integer, string, unwrapped

Class Method Details

.attribute(field, type, **options) ⇒ void

This method returns an undefined value.

Defines an attribute for the contract.

Only a subset of options is allowed inside a contract.

Parameters:

  • field (Symbol)

    the field name

  • type (Symbol, Class, Array)

    the type or union of types

  • options (Hash)

    allowed options like :required or :validator



51
52
53
54
# File 'lib/castkit/contract/base.rb', line 51

def attribute(field, type, **options)
  options = options.slice(*ATTRIBUTE_OPTIONS)
  attributes[field] = Castkit::Attribute.new(field, type, **options)
end

.attributesHash{Symbol => Castkit::Attribute}

Returns the defined attributes.

Returns:



83
84
85
# File 'lib/castkit/contract/base.rb', line 83

def attributes
  definition[:attributes]
end

.validate(input) ⇒ Castkit::Contract::Result

Validates input against the contract and returns a Result.

Parameters:

  • input (Hash)

Returns:



60
61
62
63
64
# File 'lib/castkit/contract/base.rb', line 60

def validate(input)
  validate!(input)
rescue Castkit::ContractError => e
  Castkit::Contract::Result.new(definition[:name].to_s, input, errors: e.errors)
end

.validate!(input) ⇒ void

This method returns an undefined value.

Validates input and raises on failure.

Parameters:

  • input (Hash)

Raises:



71
72
73
74
# File 'lib/castkit/contract/base.rb', line 71

def validate!(input)
  Castkit::Contract::Validator.call!(attributes.values, input, **validation_rules)
  Castkit::Contract::Result.new(definition[:name].to_s, input)
end