class Avromatic::Model::Attributes::AttributeDefinition

Attributes

default[R]
field[R]
name[R]
name_string[R]
owner[R]
setter_name[R]
type[R]

Public Class Methods

new(owner:, field:, type:) click to toggle source
# File lib/avromatic/model/attributes.rb, line 28
def initialize(owner:, field:, type:)
  @owner = owner
  @field = field
  @required = FieldHelper.required?(field)
  @nullable = FieldHelper.nullable?(field)
  @type = type
  @values_immutable = type.referenced_model_classes.all?(&:recursively_immutable?)
  @name = field.name.to_sym
  @name_string = field.name.to_s.dup.freeze
  @setter_name = "#{field.name}=".to_sym
  @default = if field.default == :no_default
               nil
             elsif field.default.duplicable?
               field.default.dup.deep_freeze
             else
               field.default
             end
end

Public Instance Methods

coerce(input) click to toggle source
# File lib/avromatic/model/attributes.rb, line 59
def coerce(input)
  type.coerce(input)
rescue Avromatic::Model::UnknownAttributeError => e
  raise Avromatic::Model::CoercionError.new(
    "Value for #{owner.name}##{name} could not be coerced to a #{type.name} " \
    "because the following unexpected attributes were provided: #{e.unknown_attributes.join(', ')}. " \
    "Only the following attributes are allowed: #{e.allowed_attributes.join(', ')}. " \
    "Provided argument: #{input.inspect}"
  )
rescue StandardError
  if type.input_classes && type.input_classes.none? { |input_class| input.is_a?(input_class) }
    raise Avromatic::Model::CoercionError.new(
      "Value for #{owner.name}##{name} could not be coerced to a #{type.name} " \
      "because a #{input.class.name} was provided but expected a #{type.input_classes.map(&:name).to_sentence(
        two_words_connector: ' or ', last_word_connector: ', or '
      )}. " \
      "Provided argument: #{input.inspect}"
    )
  elsif input.is_a?(Hash) && type.is_a?(Avromatic::Model::Types::UnionType)
    raise Avromatic::Model::CoercionError.new(
      "Value for #{owner.name}##{name} could not be coerced to a #{type.name} " \
      "because no union member type matches the provided attributes: #{input.inspect}"
    )
  else
    raise Avromatic::Model::CoercionError.new(
      "Value for #{owner.name}##{name} could not be coerced to a #{type.name}. " \
      "Provided argument: #{input.inspect}"
    )
  end
end
nullable?() click to toggle source
# File lib/avromatic/model/attributes.rb, line 47
def nullable?
  @nullable
end
required?() click to toggle source
# File lib/avromatic/model/attributes.rb, line 51
def required?
  @required
end
values_immutable?() click to toggle source
# File lib/avromatic/model/attributes.rb, line 55
def values_immutable?
  @values_immutable
end