parent
56bd413a16
commit
317a1141c0
@ -1,105 +0,0 @@ |
|||||||
/* |
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package unitconv |
|
||||||
|
|
||||||
import ( |
|
||||||
"errors" |
|
||||||
"fmt" |
|
||||||
"regexp" |
|
||||||
"strconv" |
|
||||||
"strings" |
|
||||||
) |
|
||||||
|
|
||||||
// Units of various bytes in ascending order
|
|
||||||
const ( |
|
||||||
UNIT_BYTE = 1 << (10 * iota) |
|
||||||
UNIT_KILOBYTE |
|
||||||
UNIT_MEGABYTE |
|
||||||
UNIT_GIGABYTE |
|
||||||
UNIT_TERABYTE |
|
||||||
UNIT_PETABYTE |
|
||||||
) |
|
||||||
|
|
||||||
// Convert bytes length in integer to human readable string
|
|
||||||
func BytesToString(bytes uint64) string { |
|
||||||
var unit string = "B" |
|
||||||
var value uint64 = 0 |
|
||||||
|
|
||||||
switch { |
|
||||||
case bytes >= UNIT_TERABYTE: |
|
||||||
unit = "TB" |
|
||||||
value = uint64(bytes / UNIT_TERABYTE) |
|
||||||
case bytes >= UNIT_GIGABYTE: |
|
||||||
unit = "GB" |
|
||||||
value = uint64(bytes / UNIT_GIGABYTE) |
|
||||||
case bytes >= UNIT_MEGABYTE: |
|
||||||
unit = "MB" |
|
||||||
value = uint64(bytes / UNIT_MEGABYTE) |
|
||||||
case bytes >= UNIT_KILOBYTE: |
|
||||||
unit = "KB" |
|
||||||
value = uint64(bytes / UNIT_KILOBYTE) |
|
||||||
case bytes < UNIT_KILOBYTE && bytes >= UNIT_BYTE: |
|
||||||
unit = "B" |
|
||||||
value = uint64(bytes / UNIT_BYTE) |
|
||||||
} |
|
||||||
|
|
||||||
return fmt.Sprintf("%d%s", value, unit) |
|
||||||
} |
|
||||||
|
|
||||||
// Convert human readable string to bytes length in integer
|
|
||||||
func StringToBytes(s string) (uint64, error) { |
|
||||||
var bytes uint64 |
|
||||||
var err error |
|
||||||
|
|
||||||
bytes, err = strconv.ParseUint(s, 10, 64) |
|
||||||
if err == nil { |
|
||||||
return bytes, nil |
|
||||||
} |
|
||||||
|
|
||||||
stringPattern, err := regexp.Compile(`(?i)^(-?\d+)([BKMGT])B?$`) |
|
||||||
if err != nil { |
|
||||||
return 0, err |
|
||||||
} |
|
||||||
|
|
||||||
parts := stringPattern.FindStringSubmatch(strings.TrimSpace(s)) |
|
||||||
if len(parts) < 2 { |
|
||||||
return 0, errors.New("Incorrect string format must be K,KB,M,MB,G,GB") |
|
||||||
} |
|
||||||
|
|
||||||
value, err := strconv.ParseUint(parts[1], 10, 0) |
|
||||||
if err != nil || value < 1 { |
|
||||||
return 0, err |
|
||||||
} |
|
||||||
|
|
||||||
unit := strings.ToUpper(parts[2]) |
|
||||||
switch unit { |
|
||||||
case "T": |
|
||||||
bytes = value * UNIT_TERABYTE |
|
||||||
case "G": |
|
||||||
bytes = value * UNIT_GIGABYTE |
|
||||||
case "M": |
|
||||||
bytes = value * UNIT_MEGABYTE |
|
||||||
case "K": |
|
||||||
bytes = value * UNIT_KILOBYTE |
|
||||||
case "B": |
|
||||||
bytes = value * UNIT_BYTE |
|
||||||
default: |
|
||||||
return 0, errors.New("Incorrect string format must be K,KB,M,MB,G,GB") |
|
||||||
} |
|
||||||
|
|
||||||
return bytes, nil |
|
||||||
} |
|
@ -1,112 +0,0 @@ |
|||||||
/* |
|
||||||
* Mini Object Storage, (C) 2014 Minio, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package unitconv |
|
||||||
|
|
||||||
import ( |
|
||||||
"testing" |
|
||||||
|
|
||||||
. "gopkg.in/check.v1" |
|
||||||
) |
|
||||||
|
|
||||||
type MySuite struct{} |
|
||||||
|
|
||||||
var _ = Suite(&MySuite{}) |
|
||||||
|
|
||||||
func Test(t *testing.T) { TestingT(t) } |
|
||||||
|
|
||||||
func (s *MySuite) Test(c *C) { |
|
||||||
value := BytesToString(100 * UNIT_BYTE) |
|
||||||
c.Assert(value, Equals, "100B") |
|
||||||
|
|
||||||
value = BytesToString(100 * UNIT_KILOBYTE) |
|
||||||
c.Assert(value, Equals, "100KB") |
|
||||||
|
|
||||||
value = BytesToString(100 * UNIT_MEGABYTE) |
|
||||||
c.Assert(value, Equals, "100MB") |
|
||||||
|
|
||||||
value = BytesToString(100 * UNIT_GIGABYTE) |
|
||||||
c.Assert(value, Equals, "100GB") |
|
||||||
|
|
||||||
value = BytesToString(100 * UNIT_TERABYTE) |
|
||||||
c.Assert(value, Equals, "100TB") |
|
||||||
|
|
||||||
bytes, err := StringToBytes("100B") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100KB") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_KILOBYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100K") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_KILOBYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100MB") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_MEGABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100M") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_MEGABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100GB") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_GIGABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100G") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_GIGABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100TB") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_TERABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("100T") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(100*UNIT_TERABYTE)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("0") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(0)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("23") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(23)) |
|
||||||
|
|
||||||
bytes, err = StringToBytes("0TB") |
|
||||||
c.Assert(err, IsNil) |
|
||||||
c.Assert(bytes, Equals, uint64(0)) |
|
||||||
} |
|
||||||
|
|
||||||
func (s *MySuite) TestBadInput(c *C) { |
|
||||||
_, err := StringToBytes("") |
|
||||||
c.Assert(err, Not(IsNil)) |
|
||||||
|
|
||||||
_, err = StringToBytes("HELLO") |
|
||||||
c.Assert(err, Not(IsNil)) |
|
||||||
|
|
||||||
_, err = StringToBytes("-20B") |
|
||||||
c.Assert(err, Not(IsNil)) |
|
||||||
|
|
||||||
_, err = StringToBytes("-20MB") |
|
||||||
c.Assert(err, Not(IsNil)) |
|
||||||
} |
|
Loading…
Reference in new issue