Current section

Files

Jump to
cuttlefish src cuttlefish_bytesize.erl
Raw

src/cuttlefish_bytesize.erl

%% -------------------------------------------------------------------
%%
%% cuttlefish_bytesize: complexity for parsing bytesizes
%%
%% Copyright (c) 2013 Basho Technologies, Inc. All Rights Reserved.
%%
%% This file is provided to you 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.
%%
%% -------------------------------------------------------------------
-module(cuttlefish_bytesize).
-define(KILOBYTE, 1024).
-define(MEGABYTE, 1048576).
-define(GIGABYTE, 1073741824).
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.
-export([parse/1, to_string/1]).
%% @doc turns an integer of bytes into a string.
%% Will use the smallest unit to not lose precision.
%% e.g. 1024 -> 1kb, but 1025 = 1025.
-spec to_string(integer()) -> string().
to_string(Bytez) ->
case { Bytez rem ?GIGABYTE, Bytez rem ?MEGABYTE, Bytez rem ?KILOBYTE} of
{0, _, _} ->
integer_to_list(Bytez div ?GIGABYTE) ++ "GB";
{_, 0, _} ->
integer_to_list(Bytez div ?MEGABYTE) ++ "MB";
{_, _, 0} ->
integer_to_list(Bytez div ?KILOBYTE) ++ "KB";
_ ->
integer_to_list(Bytez)
end.
%% @doc the reverse of to_string/1. turns "1kb" or "1KB" into 1024.
-spec parse(string()) -> integer()|cuttlefish_error:error().
parse(String) ->
case lists:reverse(String) of
[$B,$K|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)), ?KILOBYTE);
[$b,$k|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)), ?KILOBYTE);
[$B,$M|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)), ?MEGABYTE);
[$b,$m|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)), ?MEGABYTE);
[$B,$G|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)), ?GIGABYTE);
[$b,$g|BSize] -> bmult(cuttlefish_util:numerify(lists:reverse(BSize)),?GIGABYTE);
BSize -> cuttlefish_util:numerify(lists:reverse(BSize))
end.
-spec bmult(number()|cuttlefish_error:error(), integer()) ->
number()|cuttlefish_error:error().
bmult({error, _ErrorTerm}=Error, _Mult) ->
Error;
bmult(Quantity, Multiplier) ->
Quantity * Multiplier.
-ifdef(TEST).
to_string_test() ->
?assertEqual("1KB", to_string(1024)),
?assertEqual("2KB", to_string(2048)),
?assertEqual("10MB", to_string(10485760)),
?assertEqual("1GB", to_string(1073741824)),
?assertEqual("20", to_string(20)),
ok.
parse_test() ->
?assertEqual(1024, parse("1kb")),
?assertEqual(2048, parse("2KB")),
?assertEqual(10485760, parse("10mb")),
?assertEqual(10485760, parse("10MB")),
?assertEqual(1073741824, parse("1GB")),
?assertEqual(1073741824, parse("1gb")),
?assertEqual(20, parse("20")),
?assertEqual({error, {number_parse, "10MB10"}}, parse("10MB10kb")),
ok.
-endif.