hoppergee/solidservice

View on GitHub
lib/solidservice/base.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
module SolidService
  class Base
  
    class << self

      def call(params={})
        service = new(params)
        service.call
        service.state

      rescue Success
        service.state

      rescue Failure
        service.state

      rescue => e
        service.fail(error: e)
        service.state
      end
  
      def call!(params={})
        state = call(params)
        return state unless state.fail?
  
        if state.error
          raise state.error
        else
          raise Error.new("Service failed", service_result: state)
        end
      end

    end
  
    attr_reader :params, :state
  
    def initialize(params)
      @params = (params || {}).with_indifferent_access
      @state = State.new(:success)
    end
  
    def call
      raise "Override please"
    end

    ##########
    # Private
    ##########
  
    def success!(params={})
      @state = State.new(:success, params)
      raise Success.new
    end
  
    def fail!(params={})
      @state = State.new(:fail, params)
      raise Failure.new
    end

    def success(params={})
      @state = State.new(:success, params)
    end

    def fail(params={})
      @state = State.new(:fail, params)
    end

  end
end