Sha256: 25469af48e16c27e24d0e7c164e77321de6d4681d83c54bc2f578fdb5e495098

Contents?: true

Size: 1.59 KB

Versions: 5

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true

require 'dry/equalizer'
require 'dry/logic/operators'

module Dry
  module Schema
    # Predicate objects used within the DSL
    #
    # @api public
    class Predicate
      # A negated predicate
      #
      # @api private
      class Negation
        # @api private
        attr_reader :predicate

        # @api private
        def initialize(predicate)
          @predicate = predicate
        end

        # @api private
        def to_ast(*args)
          [:not, predicate.to_ast(*args)]
        end
        alias_method :ast, :to_ast
      end

      include Dry::Logic::Operators
      include Dry::Equalizer(:name, :args, :block)

      # @api private
      attr_reader :compiler

      # @api private
      attr_reader :name

      # @api private
      attr_reader :args

      # @api private
      attr_reader :block

      # @api private
      def initialize(compiler, name, args, block)
        @compiler = compiler
        @name = name
        @args = args
        @block = block
      end

      # Negate a predicate
      #
      # @return [Negation]
      #
      # @api public
      def !
        Negation.new(self)
      end

      # @api private
      def ensure_valid
        if compiler.predicates[name].arity - 1 != args.size
          raise ArgumentError, "#{name} predicate arity is invalid"
        end
      end

      # @api private
      def to_rule
        compiler.visit(to_ast)
      end

      # @api private
      def to_ast(*)
        [:predicate, [name, compiler.predicates.arg_list(name, *args)]]
      end
      alias_method :ast, :to_ast
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
dry-schema-0.6.0 lib/dry/schema/predicate.rb
dry-schema-0.5.1 lib/dry/schema/predicate.rb
dry-schema-0.5.0 lib/dry/schema/predicate.rb
dry-schema-0.4.0 lib/dry/schema/predicate.rb
dry-schema-0.3.0 lib/dry/schema/predicate.rb