Sha256: b0425ecd6a8f38a8dc155559308a3101d0519670382931d7aba0567ae71649bb

Contents?: true

Size: 841 Bytes

Versions: 1

Compression:

Stored size: 841 Bytes

Contents

require 'dry/types/decorator'
require 'dry/types/constraints'

module Dry
  module Types
    class Constrained
      include Decorator
      include Builder

      attr_reader :rule

      def initialize(type, options)
        super
        @rule = options.fetch(:rule)
      end

      def call(input)
        result = try(input)

        if valid?(result)
          result
        else
          raise ConstraintError, "#{input.inspect} violates constraints"
        end
      end
      alias_method :[], :call

      def try(input)
        type[input]
      end

      def valid?(input)
        rule.(input).success?
      end

      def constrained(options)
        with(rule: rule & Types.Rule(options))
      end

      private

      def decorate?(response)
        super || response.kind_of?(Constructor)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-types-0.6.0 lib/dry/types/constrained.rb