From 3f91774a87668cec86ca1691ff441c8ee47f5fed Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Tue, 14 Mar 2023 16:59:21 +0100 Subject: [PATCH] some reorga, added pretty progress bar --- upctl/go.mod | 8 +++- upctl/go.sum | 16 ++++++++ upctl/lib/client.go | 54 ++++++--------------------- upctl/lib/output.go | 91 ++++++++++++++++++++++++++++++++++++--------- 4 files changed, 107 insertions(+), 62 deletions(-) diff --git a/upctl/go.mod b/upctl/go.mod index 39e0da0..6e4c1d9 100644 --- a/upctl/go.mod +++ b/upctl/go.mod @@ -19,7 +19,8 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onsi/ginkgo/v2 v2.2.0 // indirect @@ -29,6 +30,8 @@ require ( github.com/quic-go/qtls-go1-19 v0.2.0 // indirect github.com/quic-go/qtls-go1-20 v0.1.0 // indirect github.com/quic-go/quic-go v0.32.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/schollz/progressbar/v3 v3.13.1 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -37,7 +40,8 @@ require ( golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/mod v0.6.0 // indirect golang.org/x/net v0.4.0 // indirect - golang.org/x/sys v0.3.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.5.0 // indirect golang.org/x/tools v0.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/upctl/go.sum b/upctl/go.sum index fd6df58..ddd8280 100644 --- a/upctl/go.sum +++ b/upctl/go.sum @@ -141,6 +141,7 @@ github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7P github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -150,8 +151,13 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -176,9 +182,13 @@ github.com/quic-go/qtls-go1-20 v0.1.0 h1:d1PK3ErFy9t7zxKsG3NXBJXZjp/kMLoIb3y/kV5 github.com/quic-go/qtls-go1-20 v0.1.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= github.com/quic-go/quic-go v0.32.0 h1:lY02md31s1JgPiiyfqJijpu/UX/Iun304FI3yUqX7tA= github.com/quic-go/quic-go v0.32.0/go.mod h1:/fCsKANhQIeD5l76c2JFU+07gVE3KaA0FP+0zMWwfwo= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= +github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -195,6 +205,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -352,10 +363,15 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/upctl/lib/client.go b/upctl/lib/client.go index ad17f3c..4b8c546 100644 --- a/upctl/lib/client.go +++ b/upctl/lib/client.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "github.com/imroc/req/v3" + "github.com/schollz/progressbar/v3" "github.com/tlinden/up/upctl/cfg" "os" "path/filepath" @@ -134,14 +135,20 @@ func UploadFiles(c *cfg.Config, args []string) error { return err } + // progres bar + bar := progressbar.Default(100) + var left float64 + // actual post w/ settings resp, err := rq.R. SetFormData(map[string]string{ "expire": c.Expire, }). SetUploadCallbackWithInterval(func(info req.UploadInfo) { - fmt.Printf("\r%q uploaded %.2f%%", info.FileName, float64(info.UploadedSize)/float64(info.FileSize)*100.0) - fmt.Println() + left = float64(info.UploadedSize) / float64(info.FileSize) * 100.0 + bar.Add(int(left)) + //fmt.Printf("\r%q uploaded %.2f%%", info.FileName, float64(info.UploadedSize)/float64(info.FileSize)*100.0) + //fmt.Println() }, 10*time.Millisecond). Post(rq.Url) @@ -149,7 +156,7 @@ func UploadFiles(c *cfg.Config, args []string) error { return err } - return printUploadsResponse(resp) + return RespondExtended(resp) } func HandleResponse(c *cfg.Config, resp *req.Response) error { @@ -200,24 +207,7 @@ func List(c *cfg.Config, args []string) error { return err } - uploads := Uploads{} - - if err := json.Unmarshal([]byte(resp.String()), &uploads); err != nil { - return errors.New("Could not unmarshall JSON response: " + err.Error()) - } - - if !uploads.Success { - return errors.New(uploads.Message) - } - - // tablewriter - data := [][]string{} - for _, entry := range uploads.Entries { - data = append(data, []string{ - entry.Id, entry.Expire, entry.Context, entry.Uploaded.Format("2006-01-02 15:04:05"), - }) - } - return WriteTable([]string{"ID", "EXPIRE", "CONTEXT", "UPLOADED"}, data) + return RespondTable(resp) } func Delete(c *cfg.Config, args []string) error { @@ -250,25 +240,5 @@ func Describe(c *cfg.Config, args []string) error { return err } - return printUploadsResponse(resp) -} - -func printUploadsResponse(resp *req.Response) error { - uploads := Uploads{} - - if err := json.Unmarshal([]byte(resp.String()), &uploads); err != nil { - return errors.New("Could not unmarshall JSON response: " + err.Error()) - } - - if !uploads.Success { - return errors.New(uploads.Message) - } - - if uploads.Message != "" { - fmt.Println(uploads.Message) - } - - WriteExtended(&uploads) - - return nil + return RespondExtended(resp) } diff --git a/upctl/lib/output.go b/upctl/lib/output.go index f988e7f..27d201f 100644 --- a/upctl/lib/output.go +++ b/upctl/lib/output.go @@ -18,22 +18,34 @@ along with this program. If not, see . package lib import ( + "encoding/json" + "errors" "fmt" + "github.com/imroc/req/v3" "github.com/olekukonko/tablewriter" "os" "time" ) -func WriteTable(headers []string, data [][]string) error { +// make a human readable version of the expire setting +func prepareExpire(expire string, start Timestamp) string { + switch expire { + case "asap": + return "On first access" + default: + return time.Unix(start.Unix()+int64(duration2int(expire)), 0).Format("2006-01-02 15:04:05") + } + + return "" +} + +// generic table writer +func WriteTable(headers []string, data [][]string) { table := tablewriter.NewWriter(os.Stdout) table.SetHeader(headers) table.AppendBulk(data) - // for _, row := range data.entries { - // table.Append(trimRow(row)) - // } - table.SetAutoWrapText(false) table.SetAutoFormatHeaders(true) table.SetHeaderAlignment(tablewriter.ALIGN_LEFT) @@ -47,21 +59,9 @@ func WriteTable(headers []string, data [][]string) error { table.SetNoWhiteSpace(true) table.Render() - - return nil -} - -func prepareExpire(expire string, start Timestamp) string { - switch expire { - case "asap": - return "On first access" - default: - return time.Unix(start.Unix()+int64(duration2int(expire)), 0).Format("2006-01-02 15:04:05") - } - - return "" } +// output like psql \x func WriteExtended(uploads *Uploads) { format := fmt.Sprintf("%%%ds: %%s\n", Maxwidth) @@ -76,3 +76,58 @@ func WriteExtended(uploads *Uploads) { fmt.Println() } } + +// extract an Uploads{} struct from json response +func GetUploadsFromResponse(resp *req.Response) (*Uploads, error) { + uploads := Uploads{} + + if err := json.Unmarshal([]byte(resp.String()), &uploads); err != nil { + return nil, errors.New("Could not unmarshall JSON response: " + err.Error()) + } + + if !uploads.Success { + return nil, errors.New(uploads.Message) + } + + return &uploads, nil +} + +// turn the Uploads{} struct into a table and print it +func RespondTable(resp *req.Response) error { + uploads, err := GetUploadsFromResponse(resp) + if err != nil { + return err + } + + if uploads.Message != "" { + fmt.Println(uploads.Message) + } + + // tablewriter + data := [][]string{} + for _, entry := range uploads.Entries { + data = append(data, []string{ + entry.Id, entry.Expire, entry.Context, entry.Uploaded.Format("2006-01-02 15:04:05"), + }) + } + + WriteTable([]string{"ID", "EXPIRE", "CONTEXT", "UPLOADED"}, data) + + return nil +} + +// turn the Uploads{} struct into xtnd output and print it +func RespondExtended(resp *req.Response) error { + uploads, err := GetUploadsFromResponse(resp) + if err != nil { + return err + } + + if uploads.Message != "" { + fmt.Println(uploads.Message) + } + + WriteExtended(uploads) + + return nil +}