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

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]
    keys[key][:type] = 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