Sha256: 8f7403236f1fbafb5481d5342d616f81c8ed9335460fd521d0b234cd67fa0b03

Contents?: true

Size: 1.99 KB

Versions: 1

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

module Opera
  module Operation
    class Result
      attr_reader :errors, # Acumulator of errors in validation + steps
                  :exceptions, # Acumulator of exceptions in steps
                  :information, # Temporal object to store related information
                  :executions # Stacktrace or Pipe of the methods evaludated

      attr_accessor :output # Final object returned if success?

      alias to_h output

      def initialize(output: nil, errors: {})
        @errors = errors
        @exceptions = {}
        @information = {}
        @executions = []
        @output = output
      end

      def failure?
        errors.any? || exceptions.any?
      end

      def success?
        !failure?
      end

      def failures
        errors.merge(exceptions)
      end

      # rubocop:disable Metrics/MethodLength
      def add_error(field, message)
        @errors[field] ||= []
        if message.is_a?(Hash)
          if @errors[field].first&.is_a?(Hash)
            @errors[field].first.merge!(message)
          else
            @errors[field].push(message)
          end
        else
          @errors[field].concat(Array(message))
        end
        @errors[field].uniq!
      end
      # rubocop:enable Metrics/MethodLength

      def add_errors(errors)
        errors.to_hash.each_pair do |key, value|
          add_error(key, value)
        end
      end

      def add_exception(method, message, classname: nil)
        key = [classname, Array(method).first].compact.join('#')
        @exceptions[key] ||= []
        @exceptions[key].push(message)
      end

      def add_exceptions(exceptions)
        exceptions.each_pair do |key, value|
          add_exception(key, value)
        end
      end

      def add_information(hash)
        @information.merge!(hash)
      end

      def add_execution(step)
        return if config.production_mode?

        @executions << step
      end

      private

      def config
        Config
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
opera-0.2.16 lib/opera/operation/result.rb