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