lib/mongoid/errors/mongoid_error.rb
# frozen_string_literal: true
# rubocop:todo all
module Mongoid
module Errors
# Default parent Mongoid error for all custom errors. This handles the base
# key for the translations and provides the convenience method for
# translating the messages.
class MongoidError < StandardError
attr_reader :problem, :summary, :resolution
BASE_KEY = "mongoid.errors.messages"
# Compose the message.
#
# @example Create the message
# error.compose_message
#
# @return [ String ] The composed message.
def compose_message(key, attributes = {})
@problem = translate_problem(key, attributes)
@summary = translate_summary(key, attributes)
@resolution = translate_resolution(key, attributes)
@problem_title = translate("message_title", {})
@summary_title = translate("summary_title", {})
@resolution_title = translate("resolution_title", {})
"\n#{@problem_title}:\n #{@problem&.strip}"+
"\n#{@summary_title}:\n #{@summary&.strip}"+
"\n#{@resolution_title}:\n #{@resolution&.strip}"
end
private
# Given the key of the specific error and the options hash, translate the
# message.
#
# @example Translate the message.
# error.translate("errors", :key => value)
#
# @param [ String ] key The key of the error in the locales.
# @param [ Hash ] options The objects to pass to create the message.
#
# @return [ String ] A localized error message string.
def translate(key, options)
::I18n.translate("#{BASE_KEY}.#{key}", **options)
end
# Create the problem.
#
# @example Create the problem.
# error.problem("error", {})
#
# @param [ String | Symbol ] key The error key.
# @param [ Hash ] attributes The attributes to interpolate.
#
# @return [ String ] The problem.
def translate_problem(key, attributes)
translate("#{key}.message", attributes)
end
# Create the summary.
#
# @example Create the summary.
# error.summary("error", {})
#
# @param [ String | Symbol ] key The error key.
# @param [ Hash ] attributes The attributes to interpolate.
#
# @return [ String ] The summary.
def translate_summary(key, attributes)
translate("#{key}.summary", attributes)
end
# Create the resolution.
#
# @example Create the resolution.
# error.resolution("error", {})
#
# @param [ String | Symbol ] key The error key.
# @param [ Hash ] attributes The attributes to interpolate.
#
# @return [ String ] The resolution.
def translate_resolution(key, attributes)
translate("#{key}.resolution", attributes)
end
end
end
end