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  }