github.com/saucelabs/saucectl@v0.175.1/internal/cmd/storage/download.go (about)

     1  package storage
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  
     9  	cmds "github.com/saucelabs/saucectl/internal/cmd"
    10  	"github.com/saucelabs/saucectl/internal/segment"
    11  	"github.com/saucelabs/saucectl/internal/usage"
    12  	"github.com/schollz/progressbar/v3"
    13  	"github.com/spf13/cobra"
    14  	"golang.org/x/text/cases"
    15  	"golang.org/x/text/language"
    16  )
    17  
    18  func DownloadCommand() *cobra.Command {
    19  	var filename string
    20  
    21  	cmd := &cobra.Command{
    22  		Use:          "download fileID",
    23  		Short:        "Downloads an app file from Sauce Storage.",
    24  		SilenceUsage: true,
    25  		Args: func(cmd *cobra.Command, args []string) error {
    26  			if len(args) == 0 || args[0] == "" {
    27  				return errors.New("no ID specified")
    28  			}
    29  
    30  			return nil
    31  		},
    32  		PreRun: func(cmd *cobra.Command, args []string) {
    33  			tracker := segment.DefaultTracker
    34  
    35  			go func() {
    36  				tracker.Collect(
    37  					cases.Title(language.English).String(cmds.FullName(cmd)),
    38  					usage.Properties{}.SetFlags(cmd.Flags()),
    39  				)
    40  				_ = tracker.Close()
    41  			}()
    42  		},
    43  		RunE: func(cmd *cobra.Command, args []string) error {
    44  			reader, size, err := appsClient.Download(args[0])
    45  			if err != nil {
    46  				return fmt.Errorf("download failed: %w", err)
    47  			}
    48  			defer reader.Close()
    49  
    50  			file, err := os.Create(filename)
    51  			if err != nil {
    52  				return fmt.Errorf("failed to create file: %w", err)
    53  			}
    54  			defer file.Close()
    55  
    56  			bar := progressbar.DefaultBytes(size, "Downloading")
    57  			_, err = io.Copy(io.MultiWriter(file, bar), reader)
    58  			_ = bar.Close()
    59  			if err != nil {
    60  				return fmt.Errorf("failed to write to file: %w", err)
    61  			}
    62  
    63  			return nil
    64  		},
    65  	}
    66  
    67  	flags := cmd.Flags()
    68  	flags.StringVarP(&filename, "filename", "f", "",
    69  		"Save the file to disk with this name.",
    70  	)
    71  
    72  	_ = cmd.MarkFlagRequired("filename")
    73  
    74  	return cmd
    75  }