74 lines
2 KiB
Go
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
|
|
}
|