package v1 import ( "context" "errors" "log/slog" rpcv1 "code.icb4dc0.de/buildr/api/generated/remote/v1" "code.icb4dc0.de/buildr/buildr/internal/errs" "code.icb4dc0.de/buildr/buildr/modules" "code.icb4dc0.de/buildr/buildr/modules/state" ) func newRemoteStateClient( logger *slog.Logger, cat modules.Category, name string, requestClient *RequestResponseClient, ) *RemoteStateClient { return &RemoteStateClient{ logger: logger, cat: cat, name: name, requestClient: requestClient, } } type RemoteStateClient struct { logger *slog.Logger requestClient *RequestResponseClient name string cat modules.Category } func (c *RemoteStateClient) GetState(ctx context.Context, key string) ([]byte, state.Metadata, error) { c.logger.Debug("Getting state", slog.String("category", c.cat.String()), slog.String("name", c.name), slog.String("key", key)) resp, err := c.requestClient.Send(ctx, &rpcv1.ExecutionServerMessage{ Envelope: &rpcv1.ExecutionServerMessage_GetState{ GetState: &rpcv1.GetStateRequest{ Key: state.KeyOfStrings(c.cat, c.name, key).Bytes(), }, }, }) if err != nil { c.logger.Warn("Failed to get state", slog.String("key", key), errs.Attr(err)) return nil, state.Metadata{}, err } statusResp, ok := resp.Envelope.(*rpcv1.ExecutionClientMessage_GetState) if !ok { return nil, state.Metadata{}, errors.New("unexpected response type") } return statusResp.GetState.Data, state.Metadata{}, nil } func (c *RemoteStateClient) SetState(ctx context.Context, key string, value []byte) error { c.logger.Debug("Setting state", slog.String("category", c.cat.String()), slog.String("name", c.name), slog.String("key", key)) _, err := c.requestClient.Send(ctx, &rpcv1.ExecutionServerMessage{ Envelope: &rpcv1.ExecutionServerMessage_SetState{ SetState: &rpcv1.SetState{ Key: state.KeyOfStrings(c.cat, c.name, key).Bytes(), Data: value, }, }, }) if err != nil { c.logger.Warn("Failed to set state", slog.String("key", key), errs.Attr(err)) } return err }