From 887653c208f6552ff959d0319101835cd61f1421 Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 28 Feb 2023 02:51:50 +0100 Subject: [PATCH] implement object_type validator with the new DSL --- .../validators/implementations/object_type.rb | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/goo/validators/implementations/object_type.rb diff --git a/lib/goo/validators/implementations/object_type.rb b/lib/goo/validators/implementations/object_type.rb new file mode 100644 index 00000000..41f0349c --- /dev/null +++ b/lib/goo/validators/implementations/object_type.rb @@ -0,0 +1,46 @@ +module Goo + module Validators + class ObjectType < ValidatorBase + include Validator + + key :object_type + + error_message ->(obj) { + if @error.eql?(:persistence) + "`#{@attr}` contains non persistent models. It will not save." + else + "`#{@attr}` contains values that are not instance of `#{@model_range.model_name}`" + end + } + + validity_check -> (obj) do + values = Array(@value) + + unless values.select { |v| !self.class.is_a_model?(v, @model_range) }.empty? + @error = :no_range + return false + end + + unless values.select { |v| !self.class.persistent?(v) }.empty? + @error = :persistence + return false + end + + return true + end + + def initialize(inst, attr, value, model_range) + super(inst, attr, value) + @model_range = model_range + end + + def self.is_a_model?(value, model_range) + value.is_a?(model_range) || (value.respond_to?(:klass) && value[:klass] == model_range) + end + + def self.persistent?(value) + value.respond_to?(:klass) || value.persistent? + end + end + end +end