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