lib/dry/validation/input_processor_compiler.rb in dry-validation-0.10.7 vs lib/dry/validation/input_processor_compiler.rb in dry-validation-0.11.0
- old
+ new
@@ -4,11 +4,11 @@
module Dry
module Validation
class InputProcessorCompiler
attr_reader :type_compiler
- DEFAULT_TYPE_NODE = [[:type, 'string']].freeze
+ DEFAULT_TYPE_NODE = [:definition, [String, {}]].freeze
def initialize
@type_compiler = Dry::Types::Compiler.new(Dry::Types)
end
@@ -29,56 +29,59 @@
visit(rule, *args)
end
def visit_type(type, *args)
if type.is_a?(Types::Constructor)
- [:constructor, [type.primitive, type.fn]]
+ constructor(type)
elsif type.respond_to?(:rule)
visit(type.rule.to_ast, *args)
- else
- DEFAULT_TYPE_NODE.first
end
end
+ def constructor(type)
+ fn_id = type.__send__(:register_fn, type.fn)
+ [:constructor, [[:definition, [type.primitive, {}]], fn_id, {}]]
+ end
+
def visit_schema(schema, *args)
hash_node(schema.input_processor_ast(identifier))
end
def visit_or(node, *args)
left, right = node
- [:sum, [visit(left, *args), visit(right, *args)]]
+ [:sum, [visit(left, *args), visit(right, *args), {}]]
end
def visit_and(node, first = true)
if first
name, type = node.map { |n| visit(n, false) }.uniq
if name.is_a?(Array)
type
else
- [:key, [name, type]]
+ [:member, [name, type]]
end
else
result = node.map { |n| visit(n, first) }.uniq
if result.size == 1
result.first
else
- (result - self.class::DEFAULT_TYPE_NODE).last
+ result.select { |r| r != self.class::DEFAULT_TYPE_NODE }.last
end
end
end
def visit_implication(node, *args)
left, right = node
key = visit(left)
if key.is_a?(Symbol)
- [:key, [key, visit(right, false)]]
+ [:member, [key, visit(right, false)]]
else
- [:sum, [key, visit(right, false)]]
+ [:sum, [key, visit(right, false), {}]]
end
end
def visit_not(node, *args)
visit(node, *args)
@@ -112,15 +115,16 @@
end
def type(predicate, args)
default = self.class::PREDICATE_MAP[:default]
- if predicate == :type?
- const = args[0]
- [:type, self.class::CONST_MAP[const] || Types.identifier(const)]
- else
- [:type, self.class::PREDICATE_MAP[predicate] || default]
- end
+ type_value = if predicate == :type?
+ const = args[0]
+ self.class::CONST_MAP[const] || Types.identifier(const)
+ else
+ self.class::PREDICATE_MAP[predicate] || default
+ end
+ Types[type_value].to_ast
end
end
end
end