lib/micro/attributes/features/activemodel_validations.rb
# frozen_string_literal: true
module Micro::Attributes
module Features
module ActiveModelValidations
module Standard
private def __call_after_attributes_assign
run_validations!
end
end
module CheckActivemodelValidationErrors
private def __check_activemodel_validation_errors
return if errors.blank?
errors_hash = errors.to_hash
defined_attributes.each do |key|
value = Utils::Hashes.assoc(errors_hash, key)
@__attributes_errors[key] = value.join(', ') if value.present?
end
end
end
module WithAccept
include CheckActivemodelValidationErrors
private def __call_after_attributes_assign
run_validations! unless attributes_errors?
__check_activemodel_validation_errors
end
end
module WithAcceptStrict
include CheckActivemodelValidationErrors
private def __call_after_attributes_assign
__raise_error_if_found_attributes_errors if attributes_errors?
run_validations!
__check_activemodel_validation_errors
end
end
module ClassMethods
def __call_after_attribute_assign__(attr_name, options)
validate, validates = options.values_at(:validate, :validates)
self.validate(validate) if validate
self.validates(attr_name, validates.dup) if validates
end
end
def self.included(base)
begin
require 'active_model'
base.send(:include, ::ActiveModel::Validations)
base.extend(ClassMethods)
case
when base <= Features::Accept::Strict then base.send(:include, WithAcceptStrict)
when base <= Features::Accept then base.send(:include, WithAccept)
else base.send(:include, Standard)
end
rescue LoadError
end
end
private_constant :Standard, :CheckActivemodelValidationErrors, :WithAccept, :WithAcceptStrict
end
end
end