From ed4c14e82b8963302941cec10a63b2592f5c32dc Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sun, 28 Dec 2025 08:24:12 -0600 Subject: [PATCH] rework route to just process payload --- internal/route/route.go | 17 +++++------------ internal/route/route_test.go | 29 +++++++++++++++++++++++------ router.go | 5 ++++- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/internal/route/route.go b/internal/route/route.go index e92b0a2..e4f8fc6 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -2,7 +2,6 @@ package route import ( "context" - "errors" "fmt" "github.com/jwetzell/showbridge-go/internal/config" @@ -33,7 +32,7 @@ type RouteIO interface { type Route interface { Input() string Output() string - HandleInput(ctx context.Context, payload any) error + ProcessPayload(ctx context.Context, payload any) (any, error) } type ProcessorRoute struct { @@ -71,24 +70,18 @@ func (r *ProcessorRoute) Output() string { return r.output } -func (r *ProcessorRoute) HandleInput(ctx context.Context, payload any) error { - router, ok := ctx.Value(RouterContextKey).(RouteIO) - - if !ok { - return errors.New("unable to get router from context") - } - +func (r *ProcessorRoute) ProcessPayload(ctx context.Context, payload any) (any, error) { for _, processor := range r.processors { processedPayload, err := processor.Process(ctx, payload) if err != nil { - return err + return nil, err } //NOTE(jwetzell) nil payload will result in the route being "terminated" if processedPayload == nil { - return nil + return nil, nil } payload = processedPayload } - return router.HandleOutput(ctx, r.output, payload) + return payload, nil } diff --git a/internal/route/route_test.go b/internal/route/route_test.go index 3de49fe..eb56ec7 100644 --- a/internal/route/route_test.go +++ b/internal/route/route_test.go @@ -2,6 +2,7 @@ package route_test import ( "context" + "slices" "testing" "github.com/jwetzell/showbridge-go/internal/config" @@ -52,9 +53,18 @@ func TestGoodRouteHandleInput(t *testing.T) { } inputData := "test input data" - err = testRoute.HandleInput(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), inputData) + payload, err := testRoute.ProcessPayload(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), inputData) if err != nil { - t.Fatalf("route HandleOutput returned error: %v", err) + t.Fatalf("route ProcessPayload returned error: %v", err) + } + + payloadBytes, ok := payload.([]byte) + if !ok { + t.Fatalf("payload should be []byte got %T", payload) + } + + if !slices.Equal([]byte(inputData), payloadBytes) { + t.Fatalf("route returned the wrong payload. expected: %+v got %+v", inputData, payloadBytes) } } @@ -73,7 +83,7 @@ func TestRouteHandleInputWithProcessorError(t *testing.T) { } inputData := "test input data" - err = testRoute.HandleInput(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), inputData) + _, err = testRoute.ProcessPayload(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), inputData) if err == nil { t.Fatalf("route HandleOutput did not return error for bad processor") } @@ -92,9 +102,12 @@ func TestRouteHandleNilPayload(t *testing.T) { return } - err = testRoute.HandleInput(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), nil) + payload, err := testRoute.ProcessPayload(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), nil) if err != nil { - t.Fatalf("route HandleOutput returned error for nil payload: %v", err) + t.Fatalf("route ProcessPayload returned error: %v", err) + } + if payload != nil { + t.Fatalf("route returned the wrong payload") } } @@ -112,10 +125,14 @@ func TestRouteHandleNilPayloadFromProcessor(t *testing.T) { t.Fatalf("route failed to create: %v", err) } - err = testRoute.HandleInput(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), nil) + payload, err := testRoute.ProcessPayload(context.WithValue(t.Context(), route.RouterContextKey, &MockRouter{}), "test") if err != nil { t.Fatalf("route HandleOutput returned error for nil payload: %v", err) } + + if payload != nil { + t.Fatalf("route returned the wrong payload") + } } func TestRouteUnknownProcessor(t *testing.T) { diff --git a/router.go b/router.go index 889b979..e66e3af 100644 --- a/router.go +++ b/router.go @@ -133,7 +133,9 @@ func (r *Router) HandleInput(sourceId string, payload any) []route.RouteIOError var routingErrors []route.RouteIOError for routeIndex, routeInstance := range r.RouteInstances { if routeInstance.Input() == sourceId { - err := routeInstance.HandleInput(context.WithValue(r.Context, route.SourceContextKey, sourceId), payload) + routeContext := context.WithValue(r.Context, route.SourceContextKey, sourceId) + + payload, err := routeInstance.ProcessPayload(routeContext, payload) if err != nil { if routingErrors == nil { routingErrors = []route.RouteIOError{} @@ -144,6 +146,7 @@ func (r *Router) HandleInput(sourceId string, payload any) []route.RouteIOError }) r.logger.Error("unable to route input", "route", routeIndex, "source", sourceId, "error", err) } + r.HandleOutput(routeContext, routeInstance.Output(), payload) } } return routingErrors