Class: Anyway::TypeCaster
- Inherits:
-
Object
- Object
- Anyway::TypeCaster
- 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
- #coerce(key, val, config: mapping) ⇒ Object
-
#initialize(mapping, registry: TypeRegistry.default, fallback: ::Anyway::AutoCast) ⇒ TypeCaster
constructor
A new instance of TypeCaster.
Constructor Details
#initialize(mapping, registry: TypeRegistry.default, fallback: ::Anyway::AutoCast) ⇒ TypeCaster
Returns a new instance of TypeCaster.
109 110 111 112 113 |
# File 'lib/anyway/type_casting.rb', line 109 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
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/anyway/type_casting.rb', line 115 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 |