buildr/internal/rpc/v1/state.go
Peter 34c431790e
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is failing
refactor: use connect-go instead of regular Google gRPC
- support binary name for plugins
- register plugins for container jobs
2023-09-12 18:43:34 +02:00

74 lines
2 KiB
Go

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
}