class Dry::Schema::Info::SchemaCompiler
@api private
Constants
- PREDICATE_TO_TYPE
Attributes
keys[R]
@api private
Public Class Methods
new()
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 29 def initialize @keys = EMPTY_HASH.dup end
Public Instance Methods
assign_type(key, type)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 104 def assign_type(key, type) if keys[key][:type] keys[key][:member] = type else keys[key][:type] = type end end
call(ast)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 39 def call(ast) visit(ast) end
to_h()
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 34 def to_h {keys: keys} end
visit(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 44 def visit(node, opts = EMPTY_HASH) meth, rest = node public_send(:"visit_#{meth}", rest, opts) end
visit_and(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 64 def visit_and(node, opts = EMPTY_HASH) left, right = node visit(left, opts) visit(right, opts) end
visit_each(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 79 def visit_each(node, opts = EMPTY_HASH) visit(node, opts.merge(member: true)) end
visit_implication(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 72 def visit_implication(node, opts = EMPTY_HASH) node.each do |el| visit(el, opts.merge(required: false)) end end
visit_key(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 84 def visit_key(node, opts = EMPTY_HASH) name, rest = node visit(rest, opts.merge(key: name, required: true)) end
visit_predicate(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 90 def visit_predicate(node, opts = EMPTY_HASH) name, rest = node key = opts[:key] if name.equal?(:key?) keys[rest[0][1]] = {required: opts.fetch(:required, true)} else type = PREDICATE_TO_TYPE[name] assign_type(key, type) if type end end
visit_set(node, opts = EMPTY_HASH)
click to toggle source
@api private
# File lib/dry/schema/extensions/info/schema_compiler.rb, line 50 def visit_set(node, opts = EMPTY_HASH) target = (key = opts[:key]) ? self.class.new : self node.each { |child| target.visit(child, opts) } return unless key target_info = opts[:member] ? {member: target.to_h} : target.to_h type = opts[:member] ? "array" : "hash" keys.update(key => {**keys[key], type: type, **target_info}) end