1package cli
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/bnema/gordon/internal/adapters/in/cli/remote"
8)
9
10type controlPlaneHandle struct {
11 plane ControlPlane
12 isRemote bool
13 closeFn func() error
14}
15
16func (h *controlPlaneHandle) close() {
17 if h == nil || h.closeFn == nil {
18 return
19 }
20 if err := h.closeFn(); err != nil {
21 log := cliLogger()
22 log.Warn().Err(err).Msg("failed to close control-plane resources")
23 }
24}
25
26var newLocalControlPlaneClient = remote.NewLocalClient
27
28func resolveDaemonClient() (*remote.Client, bool, error) {
29 client, isRemote, err := GetRemoteClient()
30 if err != nil || isRemote {
31 return client, isRemote, err
32 }
33
34 client, err = newLocalControlPlaneClient()
35 if err != nil {
36 return nil, false, fmt.Errorf("local control plane unavailable: %w", err)
37 }
38 return client, false, nil
39}
40
41func resolveControlPlane(_ string) (*controlPlaneHandle, error) {
42 client, isRemote, err := resolveDaemonClient()
43 if err != nil {
44 return nil, err
45 }
46 return &controlPlaneHandle{plane: client, isRemote: isRemote}, nil
47}
48
49func newRemoteControlPlaneHandle(target *remote.ResolvedRemote) *controlPlaneHandle {
50 client := remote.NewClient(target.URL, remoteClientOptions(target.Token, target.InsecureTLS)...)
51 return &controlPlaneHandle{plane: client, isRemote: true}
52}
53
54func resolveControlPlaneForRepository(ctx context.Context, repository string) (*controlPlaneHandle, error) {
55 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
56 return inferRemoteForRepository(ctx, repository)
57 })
58}
59
60func resolveControlPlaneWithInference(ctx context.Context, infer func(context.Context) (*remote.ResolvedRemote, error)) (*controlPlaneHandle, error) {
61 resolved, err := infer(ctx)
62 if err != nil {
63 return nil, err
64 }
65 if resolved != nil {
66 return newRemoteControlPlaneHandle(resolved), nil
67 }
68 return resolveControlPlane(cliConfigPath)
69}