sclinede/blood_contracts-instrumentation

View on GitHub
lib/blood_contracts/instrumentation/session_finalizer.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module BloodContracts
  module Instrumentation
    # Top-level interface for Instrument finalizers
    module SessionFinalizer
      module_function

      require_relative "./session_finalizer/basic.rb"
      require_relative "./session_finalizer/fibers.rb"
      require_relative "./session_finalizer/threads.rb"

      # Names of finalizers
      #
      # @return [Array<Symbol>]
      #
      FINALIZERS = %i[basic fibers threads].freeze

      # @private
      WRONG_FINALIZER_MSG = "Choose finalizer wisely: #{FINALIZERS.join(', ')}"

      # @private
      DEFAULT_POOL_SIZE = 13

      # Current thread instance of the Session finalizer
      #
      # @return [#finalize!]
      #
      def instance
        Thread.current[:bc_session_finalizer] ||=
          Instrumentation.reset_session_finalizer!
      end

      # Reset the finalizer by name
      #
      # @param name [Symbol] finalizer to find
      # @param **opts [Hash] options passed to finalizer constructor
      #
      # @return [#finalize!]
      #
      def init(name, **opts)
        Thread.current[:bc_session_finalizer] = find_finalizer_by(name, **opts)
      end

      # @private
      private def find_finalizer_by(name, pool_size: DEFAULT_POOL_SIZE)
        case name
        when :basic
          Basic
        when :fibers
          Fibers.new(pool_size)
        when :threads
          Threads
        else
          raise ArgumentError, WRONG_FINALIZER_MSG
        end
      end
    end
  end
end