Sha256: 65af4878766f35b0c05da81f19e903257a3dde4144f2f8a464338d946368d580

Contents?: true

Size: 1.73 KB

Versions: 2

Compression:

Stored size: 1.73 KB

Contents

# frozen_string_literal: true

module Micro
  module Service
    class Base
      include Micro::Attributes.without(:strict_initialize)

      UNEXPECTED_RESULT = '#call! must return a Micro::Service::Result instance'.freeze
      InvalidResultInstance = ArgumentError.new('argument must be an instance of Micro::Service::Result'.freeze)
      ResultIsAlreadyDefined = ArgumentError.new('result is already defined'.freeze)

      private_constant :UNEXPECTED_RESULT, :ResultIsAlreadyDefined, :InvalidResultInstance

      def self.>>(service)
        Micro::Service::Pipeline[self, service]
      end

      def self.call(options = {})
        new(options).call
      end

      def self.__new__(result, arg)
        instance = allocate
        instance.__set_result__(result)
        instance.send(:initialize, arg)
        instance
      end

      def call!
        raise NotImplementedError
      end

      def call
        __call
      end

      def __set_result__(result)
        raise InvalidResultInstance unless result.is_a?(Result)
        raise ResultIsAlreadyDefined if @__result
        @__result = result
      end

      private

        def __call
          result = call!
          return result if result.is_a?(Service::Result)
          raise TypeError, self.class.name + UNEXPECTED_RESULT
        end

        def __get_result__
          @__result ||= Result.new
        end

        def Success(arg = :ok)
          block_given? ? (value, type = yield, arg) : (value, type = arg, :ok)
          __get_result__.__set__(true, value, type)
        end

        def Failure(arg = :error)
          block_given? ? (value, type = yield, arg) : (value, type = arg, :error)
          __get_result__.__set__(false, value, type)
        end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
u-service-0.13.1 lib/micro/service/base.rb
u-service-0.13.0 lib/micro/service/base.rb