Class: Anyway::TypeCaster

Inherits:
Object
  • Object
show all
Defined in:
lib/anyway/type_casting.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initialize(mapping, registry: TypeRegistry.default, fallback: ::Anyway::AutoCast) ⇒ TypeCaster

Returns a new instance of TypeCaster.



105
106
107
108
109
# 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

Instance Method Details

#coerce(key, val, config: mapping) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 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