Sha256: d4ca0ae19f1fc6b60f56f6ad46b76e0d97528d84ca45ead25acda74b7e915ab5

Contents?: true

Size: 1009 Bytes

Versions: 1

Compression:

Stored size: 1009 Bytes

Contents

# frozen_string_literal: true

require 'active_model'
require 'dry-initializer'
require 'dry-monads'

require 'command/interrupt'

module Command
  extend ActiveSupport::Concern

  included do
    extend Dry::Initializer
    include Dry::Monads[:result]
    include ActiveModel::Validations

    def execute
      raise NotImplementedError
    end

    def run
      result = if valid?
                 begin
                   execute
                 rescue Command::Interrupt => e
                   errors.merge! e.errors
                 end
               end

      errors.empty? ? Success(result) : Failure(errors)
    end

    def compose(command, *args)
      outcome = command.run(*args)

      raise Command::Interrupt, outcome.failure if outcome.failure?

      outcome.value!
    end

    def inputs
      self.class.dry_initializer.attributes(self)
    end
  end

  class_methods do
    def run(*args)
      new(*args).run
    end

    def run!(*args)
      run(*args).value!
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
g2_command-0.1.0 lib/command.rb