Class: Castkit::Types::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/castkit/types/base.rb

Overview

Abstract base class for type definitions in Castkit.

Provides default behavior for (de)serialization, validation, and coercion. All primitive types should subclass this and override methods as needed.

The cast! method is the primary entry point used by attribute processing to validate and coerce values in a predictable order.

Direct Known Subclasses

Boolean, Collection, Date, DateTime, Float, Integer, String

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.cast!(value, validator: nil, options: {}, context: {}, **extra_options) ⇒ Object

Coerces and validates a value for use in a Castkit DataObject.

When force_type is true, the value is deserialized (coerced) first, then validated. This is useful when a value may need to be converted before it can pass validation (e.g. ‘“123”` → 123).

Otherwise, the raw value is validated before coercion.

Parameters:

  • value (Object)

    the input value

  • validator (#call, nil) (defaults to: nil)

    optional custom validator (default uses validate!)

  • options (Hash) (defaults to: {})

    options passed to validate!, e.g., min, max, force_type

  • context (Symbol, String, nil) (defaults to: {})

    context label for error messages

Returns:

  • (Object)

    the deserialized and validated value



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/castkit/types/base.rb', line 27

def cast!(value, validator: nil, options: {}, context: {}, **extra_options)
  options = options.merge(extra_options)
  instance = new
  validator ||= options.delete(:validator)
  validator ||= default_validator(instance)

  if options[:force_type]
    deserialized_value = instance.deserialize(value)
    invoke_validator(validator, deserialized_value, options: options, context: context)
    return deserialized_value
  end

  invoke_validator(validator, value, options: options, context: context)
  instance.deserialize(value)
end

.deserialize(value) ⇒ Object

Deserializes the value using the default type behavior.

Parameters:

  • value (Object)

Returns:

  • (Object)

    the coerced value



47
48
49
# File 'lib/castkit/types/base.rb', line 47

def deserialize(value)
  new.deserialize(value)
end

.serialize(value) ⇒ Object

Serializes the value using the default type behavior.

Parameters:

  • value (Object)

Returns:

  • (Object)


55
56
57
# File 'lib/castkit/types/base.rb', line 55

def serialize(value)
  new.serialize(value)
end

.validate!(value, options: {}, context: {}) ⇒ void

This method returns an undefined value.

Validates the value using the default validator.

Parameters:

  • value (Object)

    the value to check

  • options (Hash) (defaults to: {})

    validation rules (e.g., min, max, format)

  • context (Symbol, String) (defaults to: {})

    label for error reporting



65
66
67
# File 'lib/castkit/types/base.rb', line 65

def validate!(value, options: {}, context: {})
  new.validate!(value, options: options, context: context)
end

Instance Method Details

#deserialize(value) ⇒ Object

Deserializes the value. Override in subclasses to coerce input (e.g., ‘“123”` → 123).

Parameters:

  • value (Object)

Returns:

  • (Object)


106
107
108
# File 'lib/castkit/types/base.rb', line 106

def deserialize(value)
  value
end

#serialize(value) ⇒ Object

Serializes the value. Override in subclasses if the output should be transformed.

Parameters:

  • value (Object)

Returns:

  • (Object)


114
115
116
# File 'lib/castkit/types/base.rb', line 114

def serialize(value)
  value
end

#validate!(value, options: {}, context: {}) ⇒ void

This method returns an undefined value.

Validates the value. No-op by default.

Parameters:

  • value (Object)
  • options (Hash) (defaults to: {})
  • context (Symbol, String) (defaults to: {})


124
125
126
# File 'lib/castkit/types/base.rb', line 124

def validate!(value, options: {}, context: {})
  # override in subclasses
end