class NxtSchema::Node::Base

Attributes

coerced[RW]
coerced_nodes[R]
context[R]
error_key[R]
errors[R]
index[R]
input[RW]
locale[R]
node[RW]
output[RW]
parent[R]
root[RW]

Public Class Methods

new(node:, input: Undefined.new, parent:, context:, error_key:) click to toggle source
# File lib/nxt_schema/node/base.rb, line 4
def initialize(node:, input: Undefined.new, parent:, context:, error_key:)
  @node = node
  @input = input
  @parent = parent
  @output = nil
  @error_key = error_key
  @context = context || parent&.context
  @coerced = false
  @coerced_nodes = parent&.coerced_nodes || []
  @is_root = parent.nil?
  @root = parent.nil? ? self : parent.root
  @errors = ErrorStore.new(self)
  @locale = node.options.fetch(:locale) { parent&.locale || 'en' }.to_s

  @index = error_key
  resolve_error_key(error_key)
end

Public Instance Methods

add_error(error) click to toggle source
# File lib/nxt_schema/node/base.rb, line 39
def add_error(error)
  errors.add_validation_error(message: error)
end
add_schema_error(error) click to toggle source
# File lib/nxt_schema/node/base.rb, line 43
def add_schema_error(error)
  errors.add_schema_error(message: error)
end
call() click to toggle source
# File lib/nxt_schema/node/base.rb, line 25
def call
  raise NotImplementedError, 'Implement this in our sub class'
end
merge_errors(node) click to toggle source
# File lib/nxt_schema/node/base.rb, line 47
def merge_errors(node)
  errors.merge_errors(node)
end
root?() click to toggle source
# File lib/nxt_schema/node/base.rb, line 31
def root?
  @is_root
end
run_validations() click to toggle source
# File lib/nxt_schema/node/base.rb, line 51
def run_validations
  return false unless coerced?

  node.validations.each do |validation|
    args = [self, input]
    validation.call(*args.take(validation.arity))
  end
end
up(levels = 1) click to toggle source
# File lib/nxt_schema/node/base.rb, line 60
def up(levels = 1)
  0.upto(levels - 1).inject(self) do |acc, _|
    parent = acc.send(:parent)
    break acc unless parent

    parent
  end
end
valid?() click to toggle source
# File lib/nxt_schema/node/base.rb, line 35
def valid?
  errors.empty?
end

Private Instance Methods

apply_on_evaluators() click to toggle source
# File lib/nxt_schema/node/base.rb, line 81
def apply_on_evaluators
  node.on_evaluators.each { |evaluator| evaluator.call(input, self, context) { |result| self.input = result } }
end
coerce_input() click to toggle source
# File lib/nxt_schema/node/base.rb, line 73
def coerce_input
  output = input.is_a?(Undefined) && node.omnipresent? ? input : node.type.call(input)
  self.output = output

rescue Dry::Types::CoercionError, NxtSchema::Errors::CoercionError => error
  add_schema_error(error.message)
end
coerced?(&block) click to toggle source
# File lib/nxt_schema/node/base.rb, line 111
def coerced?(&block)
  block.call(self) if @coerced && block_given?
  @coerced
end
maybe_evaluator_applies?() click to toggle source
# File lib/nxt_schema/node/base.rb, line 85
def maybe_evaluator_applies?
  @maybe_evaluator_applies ||= node.maybe_evaluators.inject(false) do |acc, evaluator|
    result = (acc || evaluator.call(input, self, context))

    if result
      self.output = input
      break true
    else
      false
    end
  end
end
register_as_coerced_when_no_errors() click to toggle source
# File lib/nxt_schema/node/base.rb, line 98
def register_as_coerced_when_no_errors
  return unless valid?

  self.coerced = true
  coerced_nodes << self
end
resolve_error_key(key) click to toggle source
# File lib/nxt_schema/node/base.rb, line 105
def resolve_error_key(key)
  parts = [parent&.error_key].compact
  parts << (key.present? ? "#{node.name}[#{key}]" : node.name)
  @error_key = parts.join('.')
end