github.com/saucelabs/saucectl@v0.175.1/internal/cmd/apit/setsnippet.go (about) 1 package apit 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/saucelabs/saucectl/internal/apitest" 11 cmds "github.com/saucelabs/saucectl/internal/cmd" 12 "github.com/saucelabs/saucectl/internal/http" 13 "github.com/saucelabs/saucectl/internal/segment" 14 "github.com/saucelabs/saucectl/internal/usage" 15 "github.com/spf13/cobra" 16 "golang.org/x/text/cases" 17 "golang.org/x/text/language" 18 ) 19 20 func SetSnippetCommand() *cobra.Command { 21 cmd := &cobra.Command{ 22 Use: "set-snippet NAME FILE_NAME|- [--project PROJECT_NAME]", 23 Short: "Set a vault snippet", 24 Long: `Set/update a snippet in a project's vault. If a snippet NAME is already in the vault, 25 the value will be updated, otherwise a new snippet will be added. You can set a snippet's 26 value by providing a path to a file defining the snippet or use "-" to read from stdin. 27 28 Use [--project] to specify a project by its name or run without [--project] to choose from a list of projects. 29 `, 30 Example: `saucectl apit vault set-snippet snip1 ./snippet1.xml --project "smoke tests" # from a file 31 cat snippet2.xml | saucectl apit vault set-snippet snip2 - --project "smoke tests" # from stdin 32 `, 33 SilenceUsage: true, 34 Args: func(cmd *cobra.Command, args []string) error { 35 if len(args) == 0 || args[0] == "" { 36 return errors.New("no snippet name specified") 37 } 38 if len(args) == 1 || args[1] == "" { 39 return errors.New("no filename specified") 40 } 41 return nil 42 }, 43 PreRunE: func(cmd *cobra.Command, args []string) error { 44 err := http.CheckProxy() 45 if err != nil { 46 return fmt.Errorf("invalid HTTP_PROXY value") 47 } 48 49 tracker := segment.DefaultTracker 50 51 go func() { 52 tracker.Collect( 53 cases.Title(language.English).String(cmds.FullName(cmd)), 54 usage.Properties{}.SetFlags(cmd.Flags()), 55 ) 56 _ = tracker.Close() 57 }() 58 return nil 59 }, 60 RunE: func(cmd *cobra.Command, args []string) error { 61 name := args[0] 62 fileName := args[1] 63 64 b, err := readSnippet(fileName) 65 if err != nil { 66 return err 67 } 68 69 updateVault := apitest.Vault{ 70 Variables: []apitest.VaultVariable{}, 71 Snippets: map[string]string{ 72 name: string(b), 73 }, 74 } 75 76 err = apitesterClient.PutVault(context.Background(), selectedProject.Hooks[0].Identifier, updateVault) 77 if err != nil { 78 return err 79 } 80 return nil 81 }, 82 } 83 84 return cmd 85 } 86 87 func readSnippet(fileName string) ([]byte, error) { 88 var r io.Reader 89 var err error 90 if fileName == "-" { 91 r = os.Stdin 92 } else { 93 r, err = os.Open(fileName) 94 if err != nil { 95 return []byte{}, err 96 } 97 } 98 99 return io.ReadAll(r) 100 }