aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-16 23:57:24 +0100
committerPetter Rasmussen2016-01-16 23:57:24 +0100
commit204037d92075c40ed6b0db127b0617241557411e (patch)
tree6bb8db0f99cfe677f990cc3b523b88a1182b89cb
parent9eeb5957fb489f5b8ace9b55f653ae92b75c9acb (diff)
downloadgdrive-204037d92075c40ed6b0db127b0617241557411e.tar.bz2
Format list output
-rw-r--r--drive/files.go8
-rw-r--r--drive/print.go68
-rw-r--r--drive/types.go6
3 files changed, 78 insertions, 4 deletions
diff --git a/drive/files.go b/drive/files.go
index f1a4b97..b10f2f6 100644
--- a/drive/files.go
+++ b/drive/files.go
@@ -14,9 +14,11 @@ func (self *Drive) List(args ListFilesArgs) {
fileList, err := self.service.Files.List().PageSize(args.MaxFiles).Q(args.Query).Fields("nextPageToken", "files(id,name,size,createdTime)").Do()
errorF(err, "Failed listing files: %s\n", err)
- for _, f := range fileList.Files {
- fmt.Printf("%s %s %d %s\n", f.Id, f.Name, f.Size, f.CreatedTime)
- }
+ PrintFileList(PrintFileListArgs{
+ Files: fileList.Files,
+ SkipHeader: args.SkipHeader,
+ SizeInBytes: args.SizeInBytes,
+ })
}
diff --git a/drive/print.go b/drive/print.go
index 5473690..85d51b4 100644
--- a/drive/print.go
+++ b/drive/print.go
@@ -1,13 +1,36 @@
package drive
import (
+ "os"
"fmt"
+ "text/tabwriter"
"strings"
"strconv"
+ "unicode/utf8"
"time"
)
+func PrintFileList(args PrintFileListArgs) {
+ w := new(tabwriter.Writer)
+ w.Init(os.Stdout, 0, 0, 3, ' ', 0)
+
+ if !args.SkipHeader {
+ fmt.Fprintln(w, "Id\tName\tSize\tCreated")
+ }
+
+ for _, f := range args.Files {
+ fmt.Fprintf(w, "%s\t%s\t%s\t%s\n",
+ f.Id,
+ truncateString(f.Name, 40),
+ formatSize(f.Size, args.SizeInBytes),
+ formatDatetime(f.CreatedTime),
+ )
+ }
+
+ w.Flush()
+}
+
func PrintFileInfo(args PrintFileInfoArgs) {
f := args.File
@@ -31,7 +54,6 @@ func PrintFileInfo(args PrintFileInfoArgs) {
}
}
-
func formatList(a []string) string {
return strings.Join(a, ", ")
}
@@ -67,3 +89,47 @@ func formatDatetime(iso string) string {
hour, min, sec := local.Clock()
return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec)
}
+
+// Truncates string to given max length, and inserts ellipsis into
+// the middle of the string to signify that the string has been truncated
+func truncateString(str string, maxRunes int) string {
+ indicator := "..."
+
+ // Number of runes in string
+ runeCount := utf8.RuneCountInString(str)
+
+ // Return input string if length of input string is less than max length
+ // Input string is also returned if max length is less than 9 which is the minmal supported length
+ if runeCount <= maxRunes || maxRunes < 9 {
+ return str
+ }
+
+ // Number of remaining runes to be removed
+ remaining := (runeCount - maxRunes) + utf8.RuneCountInString(indicator)
+
+ var truncated string
+ var skip bool
+
+ for leftOffset, char := range str {
+ rightOffset := runeCount - (leftOffset + remaining)
+
+ // Start skipping chars when the left and right offsets are equal
+ // Or in the case where we wont be able to do an even split: when the left offset is larger than the right offset
+ if leftOffset == rightOffset || (leftOffset > rightOffset && !skip) {
+ skip = true
+ truncated += indicator
+ }
+
+ if skip && remaining > 0 {
+ // Skip char and decrement the remaining skip counter
+ remaining--
+ continue
+ }
+
+ // Add char to result string
+ truncated += string(char)
+ }
+
+ // Return truncated string
+ return truncated
+}
diff --git a/drive/types.go b/drive/types.go
index ecf92a1..296902c 100644
--- a/drive/types.go
+++ b/drive/types.go
@@ -51,6 +51,12 @@ type FileInfoArgs struct {
SizeInBytes bool
}
+type PrintFileListArgs struct {
+ Files []*drive.File
+ SkipHeader bool
+ SizeInBytes bool
+}
+
type PrintFileInfoArgs struct {
File *drive.File
SizeInBytes bool