main
 1# frozen_string_literal: true
 2
 3module Scim
 4  module Kit
 5    module V2
 6      # Validates a complex attribute
 7      class ComplexAttributeValidator < ::ActiveModel::Validator
 8        def validate(item)
 9          if item._type.multi_valued
10            multi_valued_validation(item)
11          else
12            item.each do |attribute|
13              item.errors.merge!(attribute.errors) unless attribute.valid?
14            end
15          end
16        end
17
18        private
19
20        def multi_valued_validation(item)
21          item.each_value do |hash|
22            validated = hash.map do |key, value|
23              attribute = item.attribute_for(key)
24              attribute._assign(value)
25              item.errors.merge!(attribute.errors) unless attribute.valid?
26
27              key.to_sym
28            end
29            validate_missing(item, hash, validated)
30          end
31        end
32
33        def validate_missing(item, hash, validated)
34          not_validated = item.map { |x| x._type.name.to_sym } - validated
35          not_validated.each do |key|
36            attribute = item.attribute_for(key)
37            attribute._assign(hash[key])
38            item.errors.merge!(attribute.errors) unless attribute.valid?
39          end
40        end
41      end
42    end
43  end
44end