github.com/Cloud-Foundations/Dominator@v0.3.4/lib/flagutil/size.go (about) 1 package flagutil 2 3 import ( 4 "strconv" 5 "strings" 6 ) 7 8 type unitType struct { 9 suffix string 10 multiplier uint64 11 } 12 13 var units = []unitType{ // In order of preference. 14 {"EiB", 1 << 60}, 15 {"PiB", 1 << 50}, 16 {"TiB", 1 << 40}, 17 {"GiB", 1 << 30}, 18 {"MiB", 1 << 20}, 19 {"KiB", 1 << 10}, 20 {"E", 1 << 60}, 21 {"P", 1 << 50}, 22 {"T", 1 << 40}, 23 {"G", 1 << 30}, 24 {"M", 1 << 20}, 25 {"K", 1 << 10}, 26 {"B", 1}, 27 {"EB", 1000000000000000000}, 28 {"PB", 1000000000000000}, 29 {"TB", 1000000000000}, 30 {"GB", 1000000000}, 31 {"MB", 1000000}, 32 {"kB", 1000}, 33 } 34 35 func (size *Size) String() string { 36 if *size == 0 { // Special case, otherwise we'll get "0EiB". 37 return "0B" 38 } 39 for _, unit := range units { 40 if unit.multiplier == 1 { 41 continue 42 } 43 pretty := uint64(*size) / unit.multiplier 44 if pretty*unit.multiplier == uint64(*size) { 45 return strconv.FormatUint(pretty, 10) + unit.suffix 46 } 47 } 48 return strconv.FormatUint(uint64(*size), 10) + "B" 49 } 50 51 func (size *Size) Set(value string) error { 52 for _, unit := range units { 53 if strings.HasSuffix(value, unit.suffix) { 54 val, err := strconv.ParseUint(value[:len(value)-len(unit.suffix)], 55 10, 64) 56 if err != nil { 57 return err 58 } else { 59 *size = Size(val * unit.multiplier) 60 return nil 61 } 62 } 63 } 64 if val, err := strconv.ParseUint(value, 10, 64); err != nil { 65 return err 66 } else { 67 *size = Size(val) 68 return nil 69 } 70 }