Sha256: 5a9eccf87455874219d9b08de08cc16f0a075b8bc9a6443d1567f7123090fda8

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

require 'active_support'

module LightOperations
  class Core
    include ::ActiveSupport::Rescuable
    include ::ActiveSupport
    MissingDependency = Class.new(StandardError)

    attr_reader :dependencies, :params, :subject

    def initialize(params = {}, dependencies = {})
      @params, @dependencies = params, dependencies
    end

    # do not override this method
    def run
      @subject = execute
      self
    rescue => exception
      rescue_with_handler(exception) || raise
    ensure
      self
    end

    def on_success(&block)
      block.call(subject) if success?
      self
    end

    def on_fail(&block)
      block.call(subject, errors) unless success?
      self
    end

    def errors
      @errors ||= (subject.respond_to?(:errors) ? subject.errors : [])
    end

    def fail?
      !success?
    end

    def success?
      errors.respond_to?(:empty?) ? errors.empty? : !errors
    end

    protected

    def execute
      fail 'Not implemented yet'
    end

    def fail!(errors = [])
      @errors = errors
    end

    def dependency(name)
      dependencies.fetch(name)
    rescue KeyError => e
      raise MissingDependency, e.message
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
light_operations-0.0.1 lib/light_operations/core.rb