Sha256: 26b0d1c23339e98448bb00d7ec19f53ec9eab3096d235d1a8b5557faec62a6d3

Contents?: true

Size: 1.96 KB

Versions: 14

Compression:

Stored size: 1.96 KB

Contents

module Dynflow
  module ExecutionPlan::Steps
    class Error < Serializable
      extend Algebrick::Matching
      include Algebrick::TypeCheck

      attr_reader :exception_class, :message, :backtrace

      def self.new(*args)
        case args.size
        when 1
          match obj = args.first,
                (on String do
                  super(StandardError, obj, caller, nil)
                end),
                (on Exception do
                  super(obj.class, obj.message, obj.backtrace, obj)
                end)
        when 3, 4
          super(*args.values_at(0..3))
        else
          raise ArgumentError, "wrong number of arguments #{args}"
        end
      end

      def initialize(exception_class, message, backtrace, exception)
        @exception_class = Child! exception_class, Exception
        @message         = Type! message, String
        @backtrace       = Type! backtrace, Array
        @exception       = Type! exception, Exception, NilClass
      end

      def self.new_from_hash(hash)
        exception_class = begin
                            hash[:exception_class].constantize
                          rescue NameError
                            Errors::UnknownError.for_exception_class(hash[:exception_class])
                          end
        self.new(exception_class, hash[:message], hash[:backtrace], nil)
      end

      def to_hash
        recursive_to_hash class:           self.class.name,
                          exception_class: exception_class.to_s,
                          message:         message,
                          backtrace:       backtrace
      end

      def to_s
        format '%s (%s)\n%s',
               (@exception || self).message,
               (@exception ? @exception.class : exception_class),
               (@exception || self).backtrace
      end

      def exception
        @exception ||
            exception_class.exception(message).tap { |e| e.set_backtrace backtrace }
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
dynflow-0.8.3 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.8.2 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.8.1 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.8.0 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.9 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.8 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.7 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.6 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.5 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.4 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.3 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.2 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.1 lib/dynflow/execution_plan/steps/error.rb
dynflow-0.7.0 lib/dynflow/execution_plan/steps/error.rb