//go:generate go run generate.go package resolvers import ( "context" "encoding/json" "log" "github.com/redis/go-redis/v9" ) // This file will not be regenerated automatically. // // It serves as dependency injection for your app, add any dependencies you require here. type Resolver struct { Redis redis.UniversalClient } func Subscribe[T any](ctx context.Context, redisClient redis.UniversalClient, event string) (<-chan *T, error) { client, ok := redisClient.(*redis.Client) if !ok { return nil, nil // or handle error } clientChannel := make(chan *T, 1) go func() { sub := client.Subscribe(ctx, event) if _, err := sub.Receive(ctx); err != nil { return } serverChannel := sub.Channel() for { select { case message := <-serverChannel: var obj *T if err := json.Unmarshal([]byte(message.Payload), &obj); err != nil { log.Print(err) return } clientChannel <- obj case <-ctx.Done(): sub.Close() return } } }() return clientChannel, nil }