Sha256: cee614878f6073aba1dc8197777b7b6c346a0f52d62b67fb05258851b29944c2

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require 'dry/core/cache'

module Dry
  module Schema
    # PrimitiveInferrer is used internally by `Macros::Filled`
    # for inferring a list of possible primitives that a given
    # type can handle.
    #
    # @api private
    class PrimitiveInferrer
      extend Dry::Core::Cache

      # Compiler reduces type AST into a list of primitives
      #
      # @api private
      class Compiler
        # @api private
        def visit(node)
          meth, rest = node
          public_send(:"visit_#{meth}", rest)
        end

        # @api private
        def visit_nominal(node)
          type, _ = node
          type
        end

        # @api private
        def visit_hash(_)
          Hash
        end
        alias_method :visit_schema, :visit_hash

        # @api private
        def visit_array(_)
          Array
        end

        # @api private
        def visit_lax(node)
          visit(node)
        end

        # @api private
        def visit_constructor(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_enum(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_sum(node)
          left, right = node

          [visit(left), visit(right)].flatten(1)
        end

        # @api private
        def visit_constrained(node)
          other, * = node
          visit(other)
        end

        # @api private
        def visit_any(_)
          Object
        end
      end

      # @return [Compiler]
      # @api private
      attr_reader :compiler

      # @api private
      def initialize
        @compiler = Compiler.new
      end

      # Infer predicate identifier from the provided type
      #
      # @return [Symbol]
      #
      # @api private
      def [](type)
        self.class.fetch_or_store(type.hash) do
          Array(compiler.visit(type.to_ast)).freeze
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dry-schema-1.3.4 lib/dry/schema/primitive_inferrer.rb
dry-schema-1.3.3 lib/dry/schema/primitive_inferrer.rb