Blame vendor/github.com/vmware/govmomi/units/size.go

Packit 63bb0d
/*
Packit 63bb0d
Copyright (c) 2015 VMware, Inc. All Rights Reserved.
Packit 63bb0d
Packit 63bb0d
Licensed under the Apache License, Version 2.0 (the "License");
Packit 63bb0d
you may not use this file except in compliance with the License.
Packit 63bb0d
You may obtain a copy of the License at
Packit 63bb0d
Packit 63bb0d
    http://www.apache.org/licenses/LICENSE-2.0
Packit 63bb0d
Packit 63bb0d
Unless required by applicable law or agreed to in writing, software
Packit 63bb0d
distributed under the License is distributed on an "AS IS" BASIS,
Packit 63bb0d
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 63bb0d
See the License for the specific language governing permissions and
Packit 63bb0d
limitations under the License.
Packit 63bb0d
*/
Packit 63bb0d
Packit 63bb0d
package units
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"errors"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"regexp"
Packit 63bb0d
	"strconv"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type ByteSize int64
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	_  = iota
Packit 63bb0d
	KB = 1 << (10 * iota)
Packit 63bb0d
	MB
Packit 63bb0d
	GB
Packit 63bb0d
	TB
Packit 63bb0d
	PB
Packit 63bb0d
	EB
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
func (b ByteSize) String() string {
Packit 63bb0d
	switch {
Packit 63bb0d
	case b >= EB:
Packit 63bb0d
		return fmt.Sprintf("%.1fEB", float32(b)/EB)
Packit 63bb0d
	case b >= PB:
Packit 63bb0d
		return fmt.Sprintf("%.1fPB", float32(b)/PB)
Packit 63bb0d
	case b >= TB:
Packit 63bb0d
		return fmt.Sprintf("%.1fTB", float32(b)/TB)
Packit 63bb0d
	case b >= GB:
Packit 63bb0d
		return fmt.Sprintf("%.1fGB", float32(b)/GB)
Packit 63bb0d
	case b >= MB:
Packit 63bb0d
		return fmt.Sprintf("%.1fMB", float32(b)/MB)
Packit 63bb0d
	case b >= KB:
Packit 63bb0d
		return fmt.Sprintf("%.1fKB", float32(b)/KB)
Packit 63bb0d
	}
Packit 63bb0d
	return fmt.Sprintf("%dB", b)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type FileSize int64
Packit 63bb0d
Packit 63bb0d
func (b FileSize) String() string {
Packit 63bb0d
	switch {
Packit 63bb0d
	case b >= EB:
Packit 63bb0d
		return fmt.Sprintf("%.1fE", float32(b)/EB)
Packit 63bb0d
	case b >= PB:
Packit 63bb0d
		return fmt.Sprintf("%.1fP", float32(b)/PB)
Packit 63bb0d
	case b >= TB:
Packit 63bb0d
		return fmt.Sprintf("%.1fT", float32(b)/TB)
Packit 63bb0d
	case b >= GB:
Packit 63bb0d
		return fmt.Sprintf("%.1fG", float32(b)/GB)
Packit 63bb0d
	case b >= MB:
Packit 63bb0d
		return fmt.Sprintf("%.1fM", float32(b)/MB)
Packit 63bb0d
	case b >= KB:
Packit 63bb0d
		return fmt.Sprintf("%.1fK", float32(b)/KB)
Packit 63bb0d
	}
Packit 63bb0d
	return fmt.Sprintf("%d", b)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
var bytesRegexp = regexp.MustCompile(`^(?i)(\d+)([BKMGTPE]?)(ib|b)?$`)
Packit 63bb0d
Packit 63bb0d
func (b *ByteSize) Set(s string) error {
Packit 63bb0d
	m := bytesRegexp.FindStringSubmatch(s)
Packit 63bb0d
	if len(m) == 0 {
Packit 63bb0d
		return errors.New("invalid byte value")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	i, err := strconv.ParseInt(m[1], 10, 64)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
	*b = ByteSize(i)
Packit 63bb0d
Packit 63bb0d
	switch m[2] {
Packit 63bb0d
	case "B", "b", "":
Packit 63bb0d
	case "K", "k":
Packit 63bb0d
		*b *= ByteSize(KB)
Packit 63bb0d
	case "M", "m":
Packit 63bb0d
		*b *= ByteSize(MB)
Packit 63bb0d
	case "G", "g":
Packit 63bb0d
		*b *= ByteSize(GB)
Packit 63bb0d
	case "T", "t":
Packit 63bb0d
		*b *= ByteSize(TB)
Packit 63bb0d
	case "P", "p":
Packit 63bb0d
		*b *= ByteSize(PB)
Packit 63bb0d
	case "E", "e":
Packit 63bb0d
		*b *= ByteSize(EB)
Packit 63bb0d
	default:
Packit 63bb0d
		return errors.New("invalid byte suffix")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}