Sha256: 4785cb3bea4128db2c06c4ba1fd959104f43905c26b48f27d7db0f0d0e397a50

Contents?: true

Size: 1.76 KB

Versions: 7

Compression:

Stored size: 1.76 KB

Contents

require 'dry/types/options'

module Dry
  module Types
    module Decorator
      include Options

      # @return [Type]
      attr_reader :type

      # @param [Type] type
      def initialize(type, *)
        super
        @type = type
      end

      # @param [Object] input
      # @param [#call, nil] block
      # @return [Result,Logic::Result]
      # @return [Object] if block given and try fails
      def try(input, &block)
        type.try(input, &block)
      end

      # @param [Object] value
      # @return [Boolean]
      def valid?(value)
        type.valid?(value)
      end
      alias_method :===, :valid?

      # @return [Boolean]
      def default?
        type.default?
      end

      # @return [Boolean]
      def constrained?
        type.constrained?
      end

      # @return [Sum]
      def optional
        Types['strict.nil'] | self
      end

      # @param [Symbol] meth
      # @param [Boolean] include_private
      # @return [Boolean]
      def respond_to_missing?(meth, include_private = false)
        super || type.respond_to?(meth)
      end

      private

      # @param [Object] response
      # @return [Boolean]
      def decorate?(response)
        response.kind_of?(type.class)
      end

      # Delegates missing methods to {#type}
      # @param [Symbol] meth
      # @param [Array] args
      # @param [#call, nil] block
      def method_missing(meth, *args, &block)
        if type.respond_to?(meth)
          response = type.__send__(meth, *args, &block)

          if decorate?(response)
            __new__(response)
          else
            response
          end
        else
          super
        end
      end

      # Replace underlying type
      def __new__(type)
        self.class.new(type, options)
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
dry-types-0.14.1 lib/dry/types/decorator.rb
dry-types-0.15.0 lib/dry/types/decorator.rb
dry-types-0.14.0 lib/dry/types/decorator.rb
dry-types-0.13.4 lib/dry/types/decorator.rb
dry-types-0.13.3 lib/dry/types/decorator.rb
dry-types-0.13.2 lib/dry/types/decorator.rb
dry-types-0.13.1 lib/dry/types/decorator.rb