Newer
Older
package queue
import (
"context"
"fmt"
"time"
cloudevents "github.com/cloudevents/sdk-go/v2"
"github.com/cloudevents/sdk-go/v2/event"
"github.com/google/uuid"
)
const eventType = "External cache input"
type Client struct {
eventClient cloudevents.Client
}
type Data struct {
Key string `json:"key"`
Value string `json:"value"`
}
func New(eventClient cloudevents.Client) *Client {
return &Client{eventClient: eventClient}
}
func (c *Client) Send(ctx context.Context, key string, data interface{}) error {
e, err := newEvent(key, data)
if err != nil {
return err
}
res := c.eventClient.Send(ctx, *e)
if cloudevents.IsUndelivered(res) {
return fmt.Errorf("failed to send event for key: %s, reason: %v", key, res)
}
return nil
}
func newEvent(key string, data interface{}) (*event.Event, error) {
e := cloudevents.NewEvent()
e.SetID(uuid.NewString()) // required field
e.SetSource(eventType) // required field
e.SetType(eventType) // required field
e.SetTime(time.Now())
err := e.SetData(event.ApplicationJSON, &Data{
Key: key,
Value: fmt.Sprintf("%v", data),
})
if err != nil {
return nil, err
}
return &e, nil
}