diff options
Diffstat (limited to 'drive/util.go')
| -rw-r--r-- | drive/util.go | 100 | 
1 files changed, 99 insertions, 1 deletions
| diff --git a/drive/util.go b/drive/util.go index 8dda213..bc2d5c3 100644 --- a/drive/util.go +++ b/drive/util.go @@ -1,10 +1,108 @@  package drive  import ( -    "fmt"      "os" +    "fmt" +    "strings" +    "strconv" +    "unicode/utf8" +    "time"  ) +type kv [2]string + +func (self kv) key() string { +    return self[0] +} + +func (self kv) value() string { +    return self[1] +} + +func formatList(a []string) string { +    return strings.Join(a, ", ") +} + +func formatSize(bytes int64, forceBytes bool) string { +    if bytes == 0 { +        return "" +    } + +    if forceBytes { +        return fmt.Sprintf("%v B", bytes) +    } + +    units := []string{"B", "KB", "MB", "GB", "TB", "PB"} + +    var i int +    value := float64(bytes) + +    for value > 1000 { +        value /= 1000 +        i++ +    } +    return fmt.Sprintf("%.1f %s", value, units[i]) +} + +func formatBool(b bool) string { +    return strings.Title(strconv.FormatBool(b)) +} + +func formatDatetime(iso string) string { +    t, err := time.Parse(time.RFC3339, iso) +    if err != nil { +        return iso +    } +    local := t.Local() +    year, month, day := local.Date() +    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 +} +  func errorF(err error, format string, a ...interface{}) {      if err == nil {          return | 
