lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb



# frozen_string_literal: true

require 'temporalio/internal/worker/workflow_instance'
require 'temporalio/worker/interceptor'
require 'temporalio/workflow'

module Temporalio
  module Internal
    module Worker
      class WorkflowInstance
        # Root implementation of the inbound interceptor.
        class InboundImplementation < Temporalio::Worker::Interceptor::Workflow::Inbound
          def initialize(instance)
            super(nil) # steep:ignore
            @instance = instance
          end

          def init(outbound)
            @instance.context._outbound = outbound
          end

          def execute(input)
            @instance.instance.execute(*input.args)
          end

          def handle_signal(input)
            invoke_handler(input.signal, input)
          end

          def handle_query(input)
            invoke_handler(input.query, input)
          end

          def validate_update(input)
            invoke_handler(input.update, input, to_invoke: input.definition.validator_to_invoke)
          end

          def handle_update(input)
            invoke_handler(input.update, input)
          end

          private

          def invoke_handler(name, input, to_invoke: input.definition.to_invoke)
            args = input.args
            # Add name as first param if dynamic
            args = [name] + args if input.definition.name.nil?
            # Assume symbol or proc
            case to_invoke
            when Symbol
              @instance.instance.send(to_invoke, *args)
            when Proc
              to_invoke.call(*args)
            else
              raise "Unrecognized invocation type #{to_invoke.class}"
            end
          end
        end
      end
    end
  end
end