dry-validation/lib/dry/validation/extensions/hints.rb

70 lines
1.6 KiB
Ruby

# frozen_string_literal: true
require "dry/monads/result"
module Dry
module Validation
# Hints extension
#
# @example
# Dry::Validation.load_extensions(:hints)
#
# contract = Dry::Validation::Contract.build do
# schema do
# required(:name).filled(:string, min_size?: 2..4)
# end
# end
#
# contract.call(name: "fo").hints
# # {:name=>["size must be within 2 - 4"]}
#
# contract.call(name: "").messages
# # {:name=>["must be filled", "size must be within 2 - 4"]}
#
# @api public
module Hints
# Hints extensions for Result
#
# @api public
module ResultExtensions
# Return error messages excluding hints
#
# @macro errors-options
# @return [MessageSet]
#
# @api public
def errors(new_options = EMPTY_HASH)
opts = new_options.merge(hints: false)
@errors.with(schema_errors(opts), opts)
end
# Return errors and hints
#
# @macro errors-options
#
# @return [MessageSet]
#
# @api public
def messages(new_options = EMPTY_HASH)
errors.with(hints.to_a, options.merge(**new_options))
end
# Return hint messages
#
# @macro errors-options
#
# @return [MessageSet]
#
# @api public
def hints(new_options = EMPTY_HASH)
schema_result.hints(new_options)
end
end
Dry::Schema.load_extensions(:hints)
Result.prepend(ResultExtensions)
end
end
end