Sha256: 8fdb8457eef6d236468c3578708b7044151ab269c56f97a2b72bdab2a2776c01

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

# frozen_string_literal: true

require 'lite/errors' unless defined?(Lite::Errors)

module Lite
  module Command
    module Extensions
      module Errors

        module ClassMethods

          def perform(*args, **kwargs, &block)
            instance = call(*args, **kwargs, &block)

            if instance.success?
              yield(instance.result, Lite::Command::Success, Lite::Command::Failure)
            else
              yield(instance.result, Lite::Command::Failure, Lite::Command::Success)
            end
          end

        end

        class << self

          def included(klass)
            klass.extend(ClassMethods)
          end

        end

        def errors
          @errors ||= Lite::Errors::Messages.new
        end

        def errored?
          !errors.empty?
        end

        def fail!
          raise Lite::Command::ValidationError
        end

        def failure?
          called? && errored?
        end

        def merge_errors!(instance, direction: :from)
          case direction
          when :from then errors.merge!(instance.errors)
          when :to then instance.errors.merge!(errors)
          end

          nil
        end

        def merge_exception!(exception, key: :internal)
          errors.add(key, "#{exception.class} - #{exception.message}")

          nil
        end

        def result!
          result if valid?
        end

        def status
          return :pending unless called?

          success? ? :success : :failure
        end

        def success?
          called? && !errored?
        end

        def validate!
          return true if success?

          fail!
        end

        alias valid? validate!

      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lite-command-1.5.0 lib/lite/command/extensions/errors.rb