dry-types/lib/dry/types/lax.rb

79 lines
1.6 KiB
Ruby

# frozen_string_literal: true
require 'dry/core/deprecations'
require 'dry/types/decorator'
module Dry
module Types
# Lax types rescue from type-related errors when constructors fail
#
# @api public
class Lax
include Type
include Decorator
include Builder
include Printable
include Dry::Equalizer(:type, inspect: false)
private :options, :constructor
# @param [Object] input
#
# @return [Object]
#
# @api public
def call(input)
type.call_safe(input) { |output = input| output }
end
alias_method :[], :call
alias_method :call_safe, :call
alias_method :call_unsafe, :call
# @param [Object] input
# @param [#call,nil] block
#
# @yieldparam [Failure] failure
# @yieldreturn [Result]
#
# @return [Result,Logic::Result]
#
# @api public
def try(input, &block)
type.try(input, &block)
rescue CoercionError => error
result = failure(input, error.message)
block ? yield(result) : result
end
# @see Nominal#to_ast
#
# @api public
def to_ast(meta: true)
[:lax, type.to_ast(meta: meta)]
end
# @return [Lax]
#
# @api public
def lax
self
end
private
# @param [Object, Dry::Types::Constructor] response
#
# @return [Boolean]
#
# @api private
def decorate?(response)
super || response.is_a?(constructor_type)
end
end
extend ::Dry::Core::Deprecations[:'dry-types']
Safe = Lax
deprecate_constant(:Safe)
end
end