in lib/openai/internal/type/base_model.rb [169:249]
def hash = fields.hash
end
def ==(other) = self.class == other.class && @data == other.to_h
def hash = [self.class, @data].hash
class << self
def coerce(value, state:)
exactness = state.fetch(:exactness)
if value.is_a?(self.class)
exactness[:yes] += 1
return value
end
unless (val = OpenAI::Internal::Util.coerce_hash(value)).is_a?(Hash)
exactness[:no] += 1
return value
end
exactness[:yes] += 1
keys = val.keys.to_set
instance = new
data = instance.to_h
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)
unless val.key?(api_name)
if required && mode != :dump && const == OpenAI::Internal::OMIT
exactness[nilable ? :maybe : :no] += 1
else
exactness[:yes] += 1
end
next
end
item = val.fetch(api_name)
keys.delete(api_name)
converted =
if item.nil? && (nilable || !required)
exactness[nilable ? :yes : :maybe] += 1
nil
else
coerced = OpenAI::Internal::Type::Converter.coerce(target, item, state: state)
case target
in OpenAI::Internal::Type::Converter | Symbol
coerced
else
item
end
end
data.store(name, converted)
end
keys.each { data.store(_1, val.fetch(_1)) }
instance
end