-
Notifications
You must be signed in to change notification settings - Fork 17
/
vault.go
116 lines (102 loc) · 2.68 KB
/
vault.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package apit
import (
"context"
"fmt"
"os"
"github.com/AlecAivazis/survey/v2"
"github.com/mattn/go-isatty"
"github.com/saucelabs/saucectl/internal/apitest"
"github.com/spf13/cobra"
)
type ResolvedProject struct {
apitest.ProjectMeta
Hooks []apitest.Hook
}
var (
selectedProject ResolvedProject
)
func VaultCommand(preRunE func(cmd *cobra.Command, args []string) error) *cobra.Command {
var projectName string
var err error
cmd := &cobra.Command{
Use: "vault",
Short: "Commands for interacting with API Testing project vaults",
SilenceUsage: true,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
if preRunE != nil {
err = preRunE(cmd, args)
if err != nil {
return err
}
}
selectedProject, err = resolve(projectName)
if err != nil {
return err
}
return nil
},
}
cmd.PersistentFlags().StringVar(&projectName, "project", "", "The name of the project the vault belongs to.")
cmd.AddCommand(
GetCommand(),
SetVariableCommand(),
GetVariableCommand(),
GetSnippetCommand(),
SetSnippetCommand(),
ListFilesCommand(),
DownloadFileCommand(),
UploadFileCommand(),
DeleteFileCommand(),
)
return cmd
}
func projectSurvey(names []string) (string, error) {
var selection string
prompt := &survey.Select{
Help: "Select the project the vault belongs to. Use --project to define a project in your command and skip this selection",
Message: "Select a vault by project name",
Options: names,
}
err := survey.AskOne(prompt, &selection)
return selection, err
}
func isTerm(fd uintptr) bool {
return isatty.IsTerminal(fd) || isatty.IsCygwinTerminal(fd)
}
func resolve(projectName string) (ResolvedProject, error) {
projects, err := apitesterClient.GetProjects(context.Background())
if projectName == "" {
if !isTerm(os.Stdin.Fd()) || !isTerm(os.Stdout.Fd()) {
return ResolvedProject{}, fmt.Errorf("no project specified, use --project to choose a project by name")
}
var names []string
for _, p := range projects {
names = append(names, p.Name)
}
projectName, err = projectSurvey(names)
}
if err != nil {
return ResolvedProject{}, err
}
var project apitest.ProjectMeta
for _, p := range projects {
if p.Name == projectName {
project = p
break
}
}
if project.ID == "" {
return ResolvedProject{}, fmt.Errorf("could not find project named %s", projectName)
}
hooks, err := apitesterClient.GetHooks(context.Background(), project.ID)
if err != nil {
return ResolvedProject{}, err
}
if len(hooks) == 0 {
return ResolvedProject{}, fmt.Errorf("project named %s has no hooks configured", projectName)
}
return ResolvedProject{
ProjectMeta: project,
Hooks: hooks,
}, nil
}