From c5f028dafd3d4647ce94764c6534da8ec9e9056d Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Mon, 23 Feb 2026 03:50:48 -0500 Subject: [PATCH] refactor: replace concrete type switch with ExecutionTrackerSetter interface (#62) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Define an ExecutionTrackerSetter interface in cmd/server/main.go alongside the other local server interfaces. The loop in registerPostStartServices now uses a single interface assertion instead of a type switch on *module.QueryHandler and *module.CommandHandler, so new module types that need execution tracking only need to implement SetExecutionTracker — no server changes required. Co-Authored-By: Claude Opus 4.6 --- cmd/server/main.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 35f5b15d..da1c51d3 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -237,6 +237,14 @@ type executionTrackerIface interface { SetEventStoreRecorder(r module.EventRecorder) } +// ExecutionTrackerSetter is implemented by any module that accepts an +// ExecutionTrackerProvider. Using this interface in place of a concrete-type +// switch means the server does not need to be modified when new module types +// require execution tracking. +type ExecutionTrackerSetter interface { + SetExecutionTracker(module.ExecutionTrackerProvider) +} + // runtimeLifecycle manages the lifecycle of running workflow instances. type runtimeLifecycle interface { StopAll(ctx context.Context) error @@ -945,10 +953,7 @@ func (app *serverApp) registerPostStartServices(logger *slog.Logger) error { } for _, svc := range engine.GetApp().SvcRegistry() { - switch h := svc.(type) { - case *module.QueryHandler: - h.SetExecutionTracker(app.services.executionTracker) - case *module.CommandHandler: + if h, ok := svc.(ExecutionTrackerSetter); ok { h.SetExecutionTracker(app.services.executionTracker) } }