Sha256: 129a33d5d6bee0aeaa49ec3f4ad2369b8831b6ee2a33652edaa3bb580d9350a0

Contents?: true

Size: 1.11 KB

Versions: 6

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

module Composable
  module Core
    module Command
      class NotImplementedError < ::StandardError; end

      attr_reader :result

      module ClassMethods
        def call(*args, **kwargs)
          new(*args, **kwargs).call
        end

        def call!(*args, **kwargs)
          new(*args, **kwargs).call(raise_exception: true)
        end
      end

      def self.prepended(base)
        base.extend ClassMethods

        base.include ActiveModel::Validations
        base.include ActiveSupport::Rescuable
      end

      def call(raise_exception: false)
        fail NotImplementedError unless defined?(super)

        @called = true
        @result = super()

        raise Error, errors.full_messages.to_sentence if raise_exception && failure?

        self
      rescue Exception => exception
        raise if raise_exception || !rescue_with_handler(exception)

        self
      end

      def success?
        called? && !failure?
      end

      def failure?
        called? && errors.any?
      end

      private

      def called?
        @called ||= false
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
composable-core-0.0.10 lib/composable/core/command.rb
composable-core-0.0.9 lib/composable/core/command.rb
composable-core-0.0.8 lib/composable/core/command.rb
composable-core-0.0.7 lib/composable/core/command.rb
composable-core-0.0.6 lib/composable/core/command.rb
composable-core-0.0.5 lib/composable/core/command.rb