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  }