class Turbopuffer::Internal::Type::BaseModel
def coerce(value, state:)
-
(self, Object)
-
Options Hash:
(**state)
-
:branched
(Integer
) -- -
:error
(Class
) -- -
:exactness
(Hash{Symbol=>Object}
) -- -
:strictness
(Boolean
) -- -
:translate_names
(Boolean
) --
Parameters:
-
state
(Hash{Symbol=>Object}
) -- . -
value
(Turbopuffer::Internal::Type::BaseModel, Hash{Object=>Object}, Object
) --
Other tags:
- Api: - private
def coerce(value, state:) exactness = state.fetch(:exactness) if value.is_a?(self) exactness[:yes] += 1 return value end unless (val = Turbopuffer::Internal::Util.coerce_hash(value)).is_a?(Hash) exactness[:no] += 1 state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}") return value end exactness[:yes] += 1 keys = val.keys.to_set instance = new data = instance.to_h status = instance.instance_variable_get(:@coerced) # rubocop:disable Metrics/BlockLength fields.each do |name, field| mode, required, target = field.fetch_values(:mode, :required, :type) api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const) src_name = state.fetch(:translate_names) ? api_name : name unless val.key?(src_name) if required && mode != :dump && const == Turbopuffer::Internal::OMIT exactness[nilable ? :maybe : :no] += 1 else exactness[:yes] += 1 end next end item = val.fetch(src_name) keys.delete(src_name) state[:error] = nil converted = if item.nil? && (nilable || !required) exactness[nilable ? :yes : :maybe] += 1 nil else coerced = Turbopuffer::Internal::Type::Converter.coerce(target, item, state: state) case target in Turbopuffer::Internal::Type::Converter | Symbol coerced else item end end status.store(name, state.fetch(:error) || true) data.store(name, converted) end # rubocop:enable Metrics/BlockLength keys.each { data.store(_1, val.fetch(_1)) } instance end