From ad5b4b52e88991a581ef6217d4500be24dd9e220 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sun, 30 Nov 2014 22:56:33 -0800 Subject: [PATCH] strbyteconv - - StringToBytes() - BytesToString() --- pkgs/strbyteconv/strbyteconv.go | 93 ++++++++++++++++++++++++++++ pkgs/strbyteconv/strbyteconv_test.go | 62 +++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 pkgs/strbyteconv/strbyteconv.go create mode 100644 pkgs/strbyteconv/strbyteconv_test.go diff --git a/pkgs/strbyteconv/strbyteconv.go b/pkgs/strbyteconv/strbyteconv.go new file mode 100644 index 000000000..64a12a76d --- /dev/null +++ b/pkgs/strbyteconv/strbyteconv.go @@ -0,0 +1,93 @@ +/* + * 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 strbyteconv + +import ( + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +const ( + UNIT_BYTE = 1 + UNIT_KILOBYTE = 1024 * UNIT_BYTE + UNIT_MEGABYTE = 1024 * UNIT_KILOBYTE + UNIT_GIGABYTE = 1024 * UNIT_MEGABYTE + UNIT_TERABYTE = 1024 * UNIT_GIGABYTE +) + +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) +} + +func StringToBytes(s string) (uint64, error) { + var bytes uint64 + + StringPattern, err := regexp.Compile(`(?i)^(-?\d+)([KMGT])B?$`) + if err != nil { + return 0, err + } + + parts := StringPattern.FindStringSubmatch(strings.TrimSpace(s)) + if len(parts) < 3 { + 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 + } + + return bytes, nil +} diff --git a/pkgs/strbyteconv/strbyteconv_test.go b/pkgs/strbyteconv/strbyteconv_test.go new file mode 100644 index 000000000..2f807ff50 --- /dev/null +++ b/pkgs/strbyteconv/strbyteconv_test.go @@ -0,0 +1,62 @@ +/* + * 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 strbyteconv + +import ( + . "gopkg.in/check.v1" + "testing" +) + +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("100KB") + 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("100GB") + 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)) + +}