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 }