From 35a9706954638cd1879f7ad291a5631f5dd57d88 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 4 Feb 2024 14:33:23 +0100 Subject: [PATCH] api/client.go: in Subscribe() handle nil handler correctly. --- api/client.go | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/api/client.go b/api/client.go index e76b2cc..e029e7f 100644 --- a/api/client.go +++ b/api/client.go @@ -2,6 +2,7 @@ package api import ( "fmt" + "reflect" "sync" "github.com/eosswedenorg/thalos/api/message" @@ -81,24 +82,30 @@ func (c *Client) hbHandler(payload []byte) { } func (c *Client) Subscribe(channel Channel) error { - var handler handler + handlers := map[string]struct { + handler handler + callback any + }{ + HeartbeatChannel.Type(): {c.hbHandler, c.OnHeartbeat}, + ActionChannel{}.Channel().Type(): {c.actHandler, c.OnAction}, + TableDeltaChannel{}.Channel().Type(): {c.tableDeltaHandler, c.OnTableDelta}, + } - switch t := channel.Type(); t { - case HeartbeatChannel.Type(): - handler = c.hbHandler - case ActionChannel{}.Channel().Type(): - handler = c.actHandler - case TableDeltaChannel{}.Channel().Type(): - handler = c.tableDeltaHandler - default: - return fmt.Errorf("invalid channel type. %s", t) + h, ok := handlers[channel.Type()] + + if !ok { + return fmt.Errorf("invalid channel type. %s", channel.Type()) + } + + if h.callback == nil || reflect.ValueOf(h.callback).IsNil() { + return fmt.Errorf("please set an handler before calling Subscribe") } // Start a worker for this channel. c.wg.Add(1) go func() { defer c.wg.Done() - c.worker(channel, handler) + c.worker(channel, h.handler) }() return nil