Sha256: 4c73678d04baf176baf45899a0d2141a2edfc3f48b2cf1bf8fff1a77cf099f8e

Contents?: true

Size: 1.86 KB

Versions: 4

Compression:

Stored size: 1.86 KB

Contents

module NulogyMessageBusProducer
  # Configuration for the gem
  # This is a private class, so do not use it directly. Use the methods on NulogyMessageBusProducer.
  class Config
    FAILURE_MODES = [:raise, :soft_fail].freeze

    attr_reader :registered_schemas
    attr_writer :context_for_subscription

    def initialize(options = {})
      @registered_schemas = {}
      producing_events_fails_with(:raise)

      update(options)
    end

    def context_for_subscription(subscription)
      @context_for_subscription ||= ->(_) {}
      @context_for_subscription.call(subscription)
    end

    def register_schema(schema:, key:)
      @registered_schemas[key] = schema
    end

    def producing_events_fails_with(mode, &block)
      @event_error_handler =
        case mode
        when :raise
          method(:raise_handler)
        when :soft_fail
          block || ->(_) {}
        else
          unknown_mode_error(mode)
        end
    end

    def handle_event_generation_error(subscription_id:, context:, variables:, result:)
      @event_error_handler.call(
        subscription_id: subscription_id,
        context: context,
        variables: variables,
        result: result
      )
    end

    def update(options = {})
      options.each { |key, value| public_send("#{key}=", value) }
    end

    private

    def raise_handler(subscription_id:, context:, variables:, result:)
      raise StandardError, <<~MESSAGE
        A subscription event could not be produced for subscription #{subscription_id}

        The GraphQL engine returned this response:

        #{result.to_h}

        context: #{context.inspect}
        variables: #{variables.inspect}
      MESSAGE
    end

    def unknown_mode_error(mode)
      options = FAILURE_MODES.map(&:inspect).join(", ")

      raise ArgumentError, "The failure mode `#{mode}` is not valid. The modes are: #{options}."
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
nulogy_message_bus_producer-3.3.0 lib/nulogy_message_bus_producer/config.rb
nulogy_message_bus_producer-3.2.1 lib/nulogy_message_bus_producer/config.rb
nulogy_message_bus_producer-3.2.0 lib/nulogy_message_bus_producer/config.rb
nulogy_message_bus_producer-3.1.1 lib/nulogy_message_bus_producer/config.rb