package main import ( "flag" "fmt" "github.com/schollz/progressbar/v3" "os" "path/filepath" "strings" ) var ( ansiMoveUp = []byte{keyEscape, '[', '1', 'A'} ansiClearLine = []byte{keyEscape, '[', '2', 'K'} ansiLineFeed = []byte{keyEscape, '[', '1', 'G'} ) func envVarUsage() { fmt.Fprintf(flag.CommandLine.Output(), " %-20s Gokapi URL (e.g. https://gokapi.example.com/)\n", envVarURL) fmt.Fprintf(flag.CommandLine.Output(), " %-20s Gokapi API key\n", envVarAPIKey) } func init() { flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [FLAGS] FILES...\n", os.Args[0]) flag.PrintDefaults() fmt.Fprintf(flag.CommandLine.Output(), "Environment variables:\n") envVarUsage() } } func progressBarReport(filename string, maxFileLen int) func(cr ChunkReport) { var pr *progressbar.ProgressBar displayedFileName := formatFilename(filename, maxFileLen) return func(cr ChunkReport) { if cr.UploadedChunks == 0 && pr == nil { pr = progressbar.DefaultBytes(cr.TotalSize, displayedFileName) } pr.Set(int(cr.UploadedBytes)) } } func displayCompletion(filename string, maxFileLen int, ur UploadResponse) { os.Stdout.Write(ansiMoveUp) os.Stdout.Write(ansiClearLine) os.Stdout.Write(ansiLineFeed) displayedFileName := formatFilename(filename, maxFileLen) fmt.Printf("%v: done - %v\n", displayedFileName, ur.FileInfo.UrlHotlink) } func displayFailedCompletion(filename string, maxFileLen int, err error) { os.Stdout.Write(ansiClearLine) os.Stdout.Write(ansiLineFeed) displayedFileName := formatFilename(filename, maxFileLen) fmt.Printf("%v: error - %v\n", displayedFileName, err) } func formatFilename(filename string, maxFileLen int) string { baseFileName := filepath.Base(filename) return strings.Repeat(" ", maxFileLen-len(baseFileName)) + baseFileName }