Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Reverse generics so that inference can handle the type arguments on c…
Browse files Browse the repository at this point in the history
…all sites
RomainMuller committed Jan 16, 2025
1 parent 122037e commit d817790
Showing 9 changed files with 29 additions and 34 deletions.
9 changes: 3 additions & 6 deletions internal/jobserver/buildid/version.go
Original file line number Diff line number Diff line change
@@ -35,13 +35,10 @@ type (
VersionSuffixResponse string
)

func (*VersionSuffixRequest) Subject() string {
return versionSubject
}

func (VersionSuffixResponse) IsResponseTo(*VersionSuffixRequest) {}
func (VersionSuffixRequest) Subject() string { return versionSubject }
func (VersionSuffixRequest) ResponseIs(VersionSuffixResponse) {}

func (s *service) versionSuffix(ctx context.Context, _ *VersionSuffixRequest) (VersionSuffixResponse, error) {
func (s *service) versionSuffix(ctx context.Context, _ VersionSuffixRequest) (VersionSuffixResponse, error) {
log := zerolog.Ctx(ctx)

s.mu.Lock()
5 changes: 3 additions & 2 deletions internal/jobserver/client/client.go
Original file line number Diff line number Diff line change
@@ -43,12 +43,13 @@ func (c *Client) Close() {
}

type (
request interface {
request[Res any] interface {
Subject() string
common.Request[Res]
}
)

func Request[Req request, Res common.ResponseTo[Req]](ctx context.Context, client *Client, req Req) (Res, error) {
func Request[Res any, Req request[Res]](ctx context.Context, client *Client, req Req) (Res, error) {
reqData, err := json.Marshal(req)
if err != nil {
var zero Res
12 changes: 6 additions & 6 deletions internal/jobserver/common/handler.go
Original file line number Diff line number Diff line change
@@ -16,19 +16,19 @@ import (
)

type (
ResponseTo[Request any] interface {
IsResponseTo(Request)
Request[Res any] interface {
ResponseIs(Res)
}
// RequestHandler is a function that processes a request of a given type, and returns a response or an error to be
// sent back to the client.
RequestHandler[Request any, Response ResponseTo[Request]] func(context.Context, Request) (Response, error)
RequestHandler[Res any, Req Request[Res]] func(context.Context, Req) (Res, error)
)

// HandleRequest returns a NATS subscription target that calls the provided request handler in a new goroutine if the
// NATS message payload can be parsed into the specified request type, and responds to the client appropriately.
func HandleRequest[Request any, Response ResponseTo[Request]](ctx context.Context, handler RequestHandler[Request, Response]) func(*nats.Msg) {
func HandleRequest[Res any, Req Request[Res]](ctx context.Context, handler RequestHandler[Res, Req]) func(*nats.Msg) {
return func(msg *nats.Msg) {
var req Request
var req Req
if err := json.Unmarshal(msg.Data, &req); err != nil {
respond(ctx, msg, errorResponse{Error: err.Error()})
return
@@ -41,7 +41,7 @@ func HandleRequest[Request any, Response ResponseTo[Request]](ctx context.Contex
respond(ctx, msg, errorResponse{Error: err.Error()})
return
}
respond(ctx, msg, successResponse[Response]{Result: resp})
respond(ctx, msg, successResponse[Res]{Result: resp})
}()
}
}
10 changes: 5 additions & 5 deletions internal/jobserver/nbt/nbt.go
Original file line number Diff line number Diff line change
@@ -117,8 +117,8 @@ const (
LabelAsmhdr Label = "go_asm.h"
)

func (StartRequest) Subject() string { return startSubject }
func (*StartResponse) IsResponseTo(StartRequest) {}
func (StartRequest) Subject() string { return startSubject }
func (StartRequest) ResponseIs(*StartResponse) {}

func (s *service) start(ctx context.Context, req StartRequest) (*StartResponse, error) {
if req.ImportPath == "" || req.BuildID == "" {
@@ -183,8 +183,8 @@ type (
}
)

func (FinishRequest) Subject() string { return finishSubject }
func (*FinishResponse) IsResponseTo(FinishRequest) {}
func (FinishRequest) Subject() string { return finishSubject }
func (FinishRequest) ResponseIs(*FinishResponse) {}

var errNoFilesNorError = errors.New("missing files, and no error reported")

@@ -214,7 +214,7 @@ func (s *service) finish(ctx context.Context, req FinishRequest) (*FinishRespons

if !state.isDone.CompareAndSwap(false, true) {
log.Info().Msg("Task was already completed (concurrent retry?)")
return &FinishResponse{}, nil
return nil, nil
}

defer state.onDone()
11 changes: 4 additions & 7 deletions internal/jobserver/pkgs/resolve.go
Original file line number Diff line number Diff line change
@@ -60,19 +60,16 @@ type (
ResolveResponse map[string]string
)

func NewResolveRequest(dir string, pattern string) *ResolveRequest {
return &ResolveRequest{
func NewResolveRequest(dir string, pattern string) ResolveRequest {
return ResolveRequest{
Dir: dir,
Env: os.Environ(),
Pattern: pattern,
}
}

func (*ResolveRequest) Subject() string {
return resolveSubject
}

func (ResolveResponse) IsResponseTo(*ResolveRequest) {}
func (ResolveRequest) Subject() string { return resolveSubject }
func (ResolveRequest) ResponseIs(ResolveResponse) {}

func (r *ResolveRequest) canonicalizeEnviron() {
named := make(map[string]string, len(r.Env))
8 changes: 4 additions & 4 deletions internal/jobserver/pkgs/resolve_test.go
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ func Test(t *testing.T) {
env := os.Environ()

// First request is expected to always be a cache miss
resp, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse](
resp, err := client.Request(
context.Background(),
conn,
&pkgs.ResolveRequest{
@@ -56,7 +56,7 @@ func Test(t *testing.T) {
// of entries in `env` is also shuffled, which should have no impact on the
// cache hitting or missing.
rand.Shuffle(len(env), func(i, j int) { env[i], env[j] = env[j], env[i] })
resp, err = client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse](
resp, err = client.Request(
context.Background(),
conn,
&pkgs.ResolveRequest{
@@ -70,7 +70,7 @@ func Test(t *testing.T) {
assert.EqualValues(t, 1, server.CacheStats.Hits())

// Third request is different, should result in a cache miss again
resp, err = client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse](
resp, err = client.Request(
context.Background(),
conn,
&pkgs.ResolveRequest{
@@ -93,7 +93,7 @@ func Test(t *testing.T) {
require.NoError(t, err)
defer conn.Close()

resp, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse](
resp, err := client.Request(
context.Background(),
conn,
&pkgs.ResolveRequest{Pattern: "definitely.not/a@valid\x01package"},
4 changes: 2 additions & 2 deletions internal/toolexec/aspect/oncompile.go
Original file line number Diff line number Diff line change
@@ -76,7 +76,7 @@ func (w Weaver) OnCompile(ctx context.Context, cmd *proxy.CompileCommand) (resEr
if js, err := client.FromEnvironment(ctx, cmd.WorkDir); err != nil {
log.Debug().Str("work-dir", cmd.WorkDir).Err(err).Msg("Failed to obtain job server client")
} else {
res, err := client.Request[nbt.StartRequest, *nbt.StartResponse](ctx, js, nbt.StartRequest{ImportPath: w.ImportPath, BuildID: cmd.Flags.BuildID})
res, err := client.Request(ctx, js, nbt.StartRequest{ImportPath: w.ImportPath, BuildID: cmd.Flags.BuildID})
if err != nil {
log.Error().Err(err).Msg("Never-build-twice start request failed")
js.Close()
@@ -133,7 +133,7 @@ func (w Weaver) OnCompile(ctx context.Context, cmd *proxy.CompileCommand) (resEr
files[nbt.LabelAsmhdr] = asmhdr
}
}
_, err := client.Request[nbt.FinishRequest, *nbt.FinishResponse](ctx, js, nbt.FinishRequest{
_, err := client.Request(ctx, js, nbt.FinishRequest{
ImportPath: w.ImportPath,
FinishToken: res.FinishToken,
Files: files,
2 changes: 1 addition & 1 deletion internal/toolexec/aspect/resolve.go
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ func resolvePackageFiles(ctx context.Context, importPath string, workDir string)
// and the root work tree contains all child work trees involved in resolutions.
req.TempDir = filepath.Join(workDir, "__tmp__")
}
archives, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse](
archives, err := client.Request(
context.Background(),
conn,
req,
2 changes: 1 addition & 1 deletion internal/toolexec/version.go
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ func ComputeVersion(ctx context.Context, cmd proxy.Command) (string, error) {
}
defer conn.Close()

res, err := client.Request[*buildid.VersionSuffixRequest, buildid.VersionSuffixResponse](context.Background(), conn, nil)
res, err := client.Request(context.Background(), conn, buildid.VersionSuffixRequest{})
if err != nil {
return "", err
}

0 comments on commit d817790

Please sign in to comment.