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