lib/aws-record/record/model_attributes.rb (65 lines of code) (raw):
# frozen_string_literal: true
module Aws
module Record
# @api private
class ModelAttributes
attr_reader :attributes, :storage_attributes
def initialize(model_class)
@model_class = model_class
@attributes = {}
@storage_attributes = {}
end
def register_attribute(name, marshaler, opts)
attribute = Attribute.new(name, opts.merge(marshaler: marshaler))
_new_attr_validation(name, attribute)
@attributes[name] = attribute
@storage_attributes[attribute.database_name] = name
attribute
end
def register_superclass_attribute(name, attribute)
_new_attr_validation(name, attribute)
@attributes[name] = attribute.dup
@storage_attributes[attribute.database_name] = name
attribute
end
def attribute_for(name)
@attributes[name]
end
def storage_name_for(name)
attribute_for(name).database_name
end
def present?(name)
attribute_for(name) ? true : false
end
def db_to_attribute_name(storage_name)
@storage_attributes[storage_name]
end
private
def _new_attr_validation(name, attribute)
_validate_attr_name(name)
_check_for_naming_collisions(name, attribute.database_name)
_check_if_reserved(name)
end
def _validate_attr_name(name)
raise ArgumentError, 'Must use symbolized :name attribute.' unless name.is_a?(Symbol)
return unless @attributes[name]
raise Errors::NameCollision, "Cannot overwrite existing attribute #{name}"
end
def _check_if_reserved(name)
return unless @model_class.instance_methods.include?(name)
raise Errors::ReservedName, "Cannot name an attribute #{name}, that would collide with an " \
'existing instance method.'
end
def _check_for_naming_collisions(name, storage_name)
if @attributes[storage_name.to_sym]
raise Errors::NameCollision, "Custom storage name #{storage_name} already exists as an " \
"attribute name in #{@attributes}"
elsif @storage_attributes[name.to_s]
raise Errors::NameCollision, "Attribute name #{name} already exists as a custom storage " \
"name in #{@storage_attributes}"
elsif @storage_attributes[storage_name]
raise Errors::NameCollision, "Custom storage name #{storage_name} already in use in " \
"#{@storage_attributes}"
end
end
end
end
end