Sha256: 8605400d6988a823dbb08e20d38ee81cf9fa26e37e58376394ab3af8d24f305e

Contents?: true

Size: 1.97 KB

Versions: 6

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

module ConvenientService
  module Service
    module Plugins
      module RaisesOnDoubleResult
        class Middleware < Core::MethodChainMiddleware
          ##
          # @return [ConvenientService::Service::Plugins::HasResult::Entities::Result]
          #
          # @internal
          #   TODO: Rewrite `RaisesOnDoubleResult` to make it thread-safe.
          #
          #   NOTE: Minimal reproducible example.
          #
          #     class Service
          #       include ConvenientService::Standard::Config
          #
          #       def result
          #         success
          #       end
          #     end
          #
          #     service = Service.new
          #
          #     10.times.reduce([]) { |threads| threads << Thread.new { service.result } }.join
          #
          def next(...)
            refute_has_result! || mark_as_has_result!

            chain.next(...)
          end

          private

          ##
          # @return [Boolean]
          # @raise [ConvenientService::Service::Plugins::RaisesOnDoubleResult::Errors::DoubleResult]
          #
          # @internal
          #   NOTE: `refute` is `!assert`.
          #   - https://docs.seattlerb.org/minitest
          #
          #   NOTE: This method contains a trailing exclamation mark in its name since it is mutable.
          #
          def refute_has_result!
            return unless entity.internals.cache.exist?(:has_result)

            raise Errors::DoubleResult.new(service: entity)
          end

          ##
          # @return [Boolean]
          #
          # @internal
          #   NOTE: Name is inspired by `mark_as_read`.
          #   - https://github.com/ledermann/unread
          #
          #   NOTE: This method contains a trailing exclamation mark in its name since it is mutable.
          #
          def mark_as_has_result!
            entity.internals.cache.write(:has_result, true)
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
convenient_service-0.12.0 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb
convenient_service-0.11.0 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb
convenient_service-0.10.1 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb
convenient_service-0.10.0 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb
convenient_service-0.9.0 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb
convenient_service-0.8.0 lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb