-
Notifications
You must be signed in to change notification settings - Fork 2
/
resolve.go
97 lines (79 loc) · 2.47 KB
/
resolve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package dispatcher
import (
"context"
"fmt"
"strings"
"go.autokitteh.dev/autokitteh/internal/kittehs"
"go.autokitteh.dev/autokitteh/sdk/sdkerrors"
"go.autokitteh.dev/autokitteh/sdk/sdktypes"
)
// Resolve an env string into an EnvID.
// - If the env string is empty, it will return an InvalidEnvID.
// - If the env string contains only a project name, it will return the default env for
// that project. If the project does not have a default env, but have a single env,
// it will return that env. If the project has more than a single env, it will fail.
// - If the env string is of the form 'project/env', it will return that env.
func resolveEnv(ctx context.Context, svcs *Services, env string) (sdktypes.EnvID, error) {
if env == "" {
return sdktypes.InvalidEnvID, nil
}
parts := strings.SplitN(env, "/", 2)
if len(parts) == 1 {
// Only a single part, meaning it's a project name.
name, err := sdktypes.ParseSymbol(parts[0])
if err != nil {
return sdktypes.InvalidEnvID, err
}
p, err := svcs.Projects.GetByName(context.Background(), name)
if err != nil {
return sdktypes.InvalidEnvID, err
}
if !p.IsValid() {
return sdktypes.InvalidEnvID, fmt.Errorf("project: %w", sdkerrors.ErrNotFound)
}
envs, err := svcs.Envs.List(ctx, p.ID())
if err != nil {
return sdktypes.InvalidEnvID, err
}
switch len(envs) {
case 0:
// No env, nothing to return.
return sdktypes.InvalidEnvID, fmt.Errorf("env: %w", sdkerrors.ErrNotFound)
case 1:
// Single env, return it.
return envs[0].ID(), nil
default:
// More than one env, try to find the default one.
_, env := kittehs.FindFirst(envs, func(env sdktypes.Env) bool {
return env.Name().String() == "default"
})
if !env.IsValid() {
return sdktypes.InvalidEnvID, fmt.Errorf("env: %w", sdkerrors.ErrNotFound)
}
return env.ID(), nil
}
}
// Two parts, project and env.
name, err := sdktypes.ParseSymbol(parts[0])
if err != nil {
return sdktypes.InvalidEnvID, err
}
p, err := svcs.Projects.GetByName(context.Background(), name)
if err != nil {
return sdktypes.InvalidEnvID, err
}
if !p.IsValid() {
return sdktypes.InvalidEnvID, sdkerrors.ErrNotFound
}
if name, err = sdktypes.ParseSymbol(parts[1]); err != nil {
return sdktypes.InvalidEnvID, err
}
e, err := svcs.Envs.GetByName(ctx, p.ID(), name)
if err != nil {
return sdktypes.InvalidEnvID, err
}
if !e.IsValid() {
return sdktypes.InvalidEnvID, sdkerrors.ErrNotFound
}
return e.ID(), nil
}