class Anyway::TypeCaster

TypeCaster is an object responsible for type-casting. It uses a provided types registry and mapping, and also accepts a fallback typecaster.

Attributes

fallback[R]
mapping[R]
registry[R]

Public Class Methods

new(mapping, registry: TypeRegistry.default, fallback: ::Anyway::AutoCast) click to toggle source
# File lib/anyway/type_casting.rb, line 105
def initialize(mapping, registry: TypeRegistry.default, fallback: ::Anyway::AutoCast)
  @mapping = mapping.deep_dup
  @registry = registry
  @fallback = fallback
end

Public Instance Methods

coerce(key, val, config: mapping) click to toggle source
# File lib/anyway/type_casting.rb, line 111
def coerce(key, val, config: mapping)
  caster_config = config[key.to_sym]

  return fallback.coerce(key, val) unless caster_config

  case caster_config
  in Hash[array:, type:, **nil]
    registry.deserialize(val, type, array: array)
  in Hash[config: subconfig]
    subconfig = subconfig.safe_constantize if subconfig.is_a?(::String)
    raise ArgumentError, "Config is not found: #{subconfig}" unless subconfig

    subconfig.new(val)
  in Hash
    return val unless val.is_a?(Hash)

    caster_config.each do |k, v|
      ks = k.to_s
      next unless val.key?(ks)

      val[ks] = coerce(k, val[ks], config: caster_config)
    end

    val
  else
    registry.deserialize(val, caster_config)
  end
end