module ExceptionExtensions::CauseEnumerable

Public Class Methods

included(klass) click to toggle source
# File lib/exception_extensions/cause_enumerable.rb, line 3
def self.included(klass)
  raise "The ::ExceptionExtensions::CauseEnumerable module is only applicable to ::Exception types" unless klass.ancestors.include?(::Exception)
  klass.class_eval do
    include Enumerable
    attr_reader :causes
  end
end
new(causes, message = nil) click to toggle source
Calls superclass method
# File lib/exception_extensions/cause_enumerable.rb, line 11
def initialize(causes, message = nil)
  validate(causes)
  @causes = causes
  if message.nil?
    # generate a message from the collection of causes
    cause_messages = @causes.map { |cause| "Exception: #{cause.message}" }
    message = "Multiple exceptions occurred! #{cause_messages.join('. ')}"
  end
  # add the message to this exception
  super(message)
end

Public Instance Methods

each(&block) click to toggle source
# File lib/exception_extensions/cause_enumerable.rb, line 23
def each(&block)
  @causes.each(&block)
end

Private Instance Methods

validate(causes) click to toggle source
# File lib/exception_extensions/cause_enumerable.rb, line 29
def validate(causes)
  # require causes to be provided
  raise "The initializer for #{self.class.name} requires an enumerable collection of causes" unless causes.is_a?(::Enumerable)
  # require causes to be provided
  raise "The initializer for #{self.class.name} requires a non-empty collection of causes" if causes.empty?
  # causes should be exceptions
  raise "The initializer for #{self.class.name} requires causes to be ::Exception types" if causes.any? { |cause| !cause.is_a?(::Exception) }
end