Class: Avromatic::Model::Attributes::AttributeDefinition

Inherits:
Object
  • Object
show all
Defined in:
lib/avromatic/model/attributes.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(owner:, field:, type:) ⇒ AttributeDefinition

Returns a new instance of AttributeDefinition.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/avromatic/model/attributes.rb', line 27

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

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def default
  @default
end

#fieldObject (readonly)

Returns the value of attribute field.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def field
  @field
end

#nameObject (readonly)

Returns the value of attribute name.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def name
  @name
end

#name_stringObject (readonly)

Returns the value of attribute name_string.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def name_string
  @name_string
end

#ownerObject (readonly)

Returns the value of attribute owner.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def owner
  @owner
end

#setter_nameObject (readonly)

Returns the value of attribute setter_name.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def setter_name
  @setter_name
end

#typeObject (readonly)

Returns the value of attribute type.



24
25
26
# File 'lib/avromatic/model/attributes.rb', line 24

def type
  @type
end

Instance Method Details

#coerce(input) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/avromatic/model/attributes.rb', line 58

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?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/avromatic/model/attributes.rb', line 46

def nullable?
  @nullable
end

#required?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/avromatic/model/attributes.rb', line 50

def required?
  @required
end

#values_immutable?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/avromatic/model/attributes.rb', line 54

def values_immutable?
  @values_immutable
end