Sha256: 81080477e8b93a15be708c200603c721fbcfc403e03c96dbbbbc08aa61fdcf48

Contents?: true

Size: 1.54 KB

Versions: 18

Compression:

Stored size: 1.54 KB

Contents

require "cc/service/invocation/invocation_chain"
require "cc/service/invocation/with_retries"
require "cc/service/invocation/with_metrics"
require "cc/service/invocation/with_error_handling"
require "cc/service/invocation/with_return_values"

class CC::Service::Invocation
  MIDDLEWARE = {
    retries: WithRetries,
    metrics: WithMetrics,
    error_handling: WithErrorHandling,
    return_values: WithReturnValues,
  }.freeze

  attr_reader :result

  # Build a chain of invocation wrappers which eventually calls receive
  # on the given service, then execute that chain.
  #
  # Order is important. Each call to #with, wraps the last.
  #
  # Usage:
  #
  #   CC::Service::Invocation.invoke(service) do |i|
  #     i.with :retries, 3
  #     i.with :metrics, $statsd
  #     i.with :error_handling, Rails.logger
  #   end
  #
  # In the above example, service.receive could happen 4 times (once,
  # then three retries) before an exception is re-raised up to the
  # metrics collector, then up again to the error handling. If the order
  # were reversed, the error handling middleware would prevent the other
  # middleware from seeing any exceptions at all.
  def self.invoke(service, &block)
    instance = new(service, &block)
    instance.result
  end

  def initialize(service)
    @chain = InvocationChain.new { service.receive }

    yield(self) if block_given?

    @result = @chain.call
  end

  def with(middleware, *args)
    if klass = MIDDLEWARE[middleware]
      wrap(klass, *args)
    end
  end

  def wrap(klass, *args)
    @chain.wrap(klass, *args)
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
codeclimate-services-1.11.4 lib/cc/service/invocation.rb
codeclimate-services-1.11.3 lib/cc/service/invocation.rb
codeclimate-services-1.11.2 lib/cc/service/invocation.rb
codeclimate-services-1.11.1 lib/cc/service/invocation.rb
codeclimate-services-1.11.0 lib/cc/service/invocation.rb
codeclimate-services-1.10.1 lib/cc/service/invocation.rb
codeclimate-services-1.10.0 lib/cc/service/invocation.rb
codeclimate-services-1.9.8 lib/cc/service/invocation.rb
codeclimate-services-1.9.7 lib/cc/service/invocation.rb
codeclimate-services-1.9.6 lib/cc/service/invocation.rb
codeclimate-services-1.9.5 lib/cc/service/invocation.rb
codeclimate-services-1.9.4 lib/cc/service/invocation.rb
codeclimate-services-1.9.3 lib/cc/service/invocation.rb
codeclimate-services-1.9.2 lib/cc/service/invocation.rb
codeclimate-services-1.9.1 lib/cc/service/invocation.rb
codeclimate-services-1.9.0 lib/cc/service/invocation.rb
codeclimate-services-1.8.0 lib/cc/service/invocation.rb
codeclimate-services-1.7.0 lib/cc/service/invocation.rb