Class: Natsuzora::Contract::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/natsuzora/contract/validator.rb

Overview

Validator for JSON data against contracts.

Constant Summary collapse

MAX_VALIDATE_DEPTH =
64

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.validate(contract, data) ⇒ Object

Validate JSON data against a contract.



30
31
32
# File 'lib/natsuzora/contract/validator.rb', line 30

def self.validate(contract, data)
  new.validate_node(contract, data, [])
end

.validate_with_target(document, data, target: ValidationTarget::CURRENT) ⇒ Object

Validate JSON data against a contract file with diff markers.



35
36
37
38
# File 'lib/natsuzora/contract/validator.rb', line 35

def self.validate_with_target(document, data, target: ValidationTarget::CURRENT)
  contract = build_contract_for_target(document, target)
  validate(contract, data)
end

Instance Method Details

#validate_node(contract, data, path) ⇒ Object

Raises:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/natsuzora/contract/validator.rb', line 40

def validate_node(contract, data, path)
  raise ValidationError.new('validation depth exceeded', render_path(path)) if path.length > MAX_VALIDATE_DEPTH

  case contract
  when AST::Any
    nil # any value is valid
  when AST::Scalar
    validate_scalar(contract, data, path)
  when AST::Record
    validate_object(contract, data, path)
  when AST::List
    validate_array(contract, data, path)
  when AST::Ref
    raise ValidationError.new("unresolved type reference '#{contract.name}'", render_path(path))
  else
    raise ArgumentError, "Unknown contract type: #{contract.class}"
  end
end