Module: Lutaml::Model::Validation

Included in:
Serialize
Defined in:
lib/lutaml/model/validation.rb

Instance Method Summary collapse

Instance Method Details

#format_element_sequences(_register) ⇒ Array?

Hook for getting format-specific element sequences for validation. XML overrides via InstanceMethods prepend.

Parameters:

  • _register (Symbol, nil)

    The register context

Returns:

  • (Array, nil)

    Element sequences or nil



72
73
74
# File 'lib/lutaml/model/validation.rb', line 72

def format_element_sequences(_register)
  nil
end

#order_namesObject



76
77
78
79
80
81
82
83
84
# File 'lib/lutaml/model/validation.rb', line 76

def order_names
  return [] unless respond_to?(:element_order) && element_order

  element_order.each_with_object([]) do |element, arr|
    next if element.text?

    arr << element.name
  end
end

#validate(register: Lutaml::Model::Config.default_register) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/lutaml/model/validation.rb', line 6

def validate(register: Lutaml::Model::Config.default_register)
  errors = []

  self.class.attributes(register).each do |name, attr|
    value = public_send(:"#{name}")

    begin
      if value.respond_to?(:validate)
        errors.concat(value.validate)
      else
        resolver = Lutaml::Model::Services::DefaultValueResolver.new(
          attr, register, self
        )
        attr.validate_value!(value, register, resolver)
      end
    rescue Lutaml::Model::CollectionCountOutOfRangeError => e
      errors << e unless attr.choice
    rescue Lutaml::Model::InvalidValueError,
           Lutaml::Model::CollectionTrueMissingError,
           Lutaml::Model::PolymorphicError,
           Lutaml::Model::ValidationFailedError,
           Lutaml::Model::RequiredAttributeMissingError,
           Lutaml::Model::PatternNotMatchedError => e
      errors << e
    end
  end

  validate_helper(errors, register)
end

#validate!(register: Lutaml::Model::Config.default_register) ⇒ Object



36
37
38
39
# File 'lib/lutaml/model/validation.rb', line 36

def validate!(register: Lutaml::Model::Config.default_register)
  errors = validate(register: register)
  raise Lutaml::Model::ValidationError.new(errors) if errors.any?
end

#validate_helper(errors, register) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/lutaml/model/validation.rb', line 41

def validate_helper(errors, register)
  self.class.choice_attributes.each do |attribute|
    attribute.validate_content!(self, register)
  end

  validate_sequence!(errors, order_names, register)
  errors
rescue Lutaml::Model::ChoiceUpperBoundError,
       Lutaml::Model::ChoiceLowerBoundError => e
  errors << e
end

#validate_sequence!(errors, names, register) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/lutaml/model/validation.rb', line 53

def validate_sequence!(errors, names, register)
  sequences = format_element_sequences(register)
  return errors if names.empty? || sequences.nil?

  sequences.each do |sequence|
    sequence.validate_content!(names, self, register)
  end
  errors
rescue Lutaml::Model::IncorrectSequenceError,
       Lutaml::Model::ChoiceUpperBoundError,
       Lutaml::Model::ChoiceLowerBoundError => e
  errors << e
end