mirror of
https://github.com/foo-dogsquared/nixos-config.git
synced 2025-01-30 22:57:55 +00:00
lib/trivial: add metric and binary unit conversion functions
This commit is contained in:
parent
6ffba900eb
commit
0989888179
@ -1,6 +1,17 @@
|
|||||||
{ pkgs, lib, self }:
|
{ pkgs, lib, self }:
|
||||||
|
|
||||||
rec {
|
rec {
|
||||||
|
/* Force a numerical value to be a floating value.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
toFloat 5698
|
||||||
|
=> 5698.0
|
||||||
|
|
||||||
|
toFloat 9859.55
|
||||||
|
=> 9859.55
|
||||||
|
*/
|
||||||
|
toFloat = x: x / 1.0;
|
||||||
|
|
||||||
/* Count the attributes with the given predicate.
|
/* Count the attributes with the given predicate.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
@ -130,4 +141,53 @@ rec {
|
|||||||
*/
|
*/
|
||||||
binaryPrefixMultiplier = c:
|
binaryPrefixMultiplier = c:
|
||||||
self.math.pow 2 (binaryPrefixExponent c);
|
self.math.pow 2 (binaryPrefixExponent c);
|
||||||
|
|
||||||
|
/* Parse the given string containing the size into its appropriate value.
|
||||||
|
Returns the value in number of bytes.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
parseBytesSizeIntoInt "4GiB"
|
||||||
|
=> 4294967296
|
||||||
|
|
||||||
|
parseBytesSizeIntoInt "2 MB"
|
||||||
|
=> 2000000
|
||||||
|
|
||||||
|
parseBytesSizeIntoInt "2 Mb"
|
||||||
|
=> 250000
|
||||||
|
*/
|
||||||
|
parseBytesSizeIntoInt = str:
|
||||||
|
let
|
||||||
|
matches = builtins.match "([[:digit:]]+)[[:space:]]*([[:alpha:]]{1})(i?[B|b])" str;
|
||||||
|
numeral = lib.toInt (lib.lists.head matches);
|
||||||
|
prefix = lib.lists.elemAt matches 1;
|
||||||
|
suffix = lib.lists.last matches;
|
||||||
|
isBinary = lib.hasPrefix "i" suffix;
|
||||||
|
|
||||||
|
multiplier =
|
||||||
|
let
|
||||||
|
multiplierFn = if isBinary then binaryPrefixMultiplier else metricPrefixMultiplier;
|
||||||
|
in
|
||||||
|
multiplierFn prefix;
|
||||||
|
bitDivider = if lib.hasSuffix "b" suffix then 8 else 1;
|
||||||
|
in
|
||||||
|
numeral * multiplier / bitDivider;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Given an attrset of unit size object, return the size in bytes.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
unitsToInt { size = 4; prefix = "G"; type = "binary"; }
|
||||||
|
=> 4294967296
|
||||||
|
|
||||||
|
unitsToInt { size = 4; prefix = "G"; type = "metric"; }
|
||||||
|
=> 4000000000
|
||||||
|
*/
|
||||||
|
unitsToInt = { size, prefix, type ? "binary" }:
|
||||||
|
let
|
||||||
|
multiplierFn =
|
||||||
|
if type == "binary" then binaryPrefixMultiplier
|
||||||
|
else if type == "metric" then metricPrefixMultiplier
|
||||||
|
else builtins.throw "no multiplier type ${type}";
|
||||||
|
in
|
||||||
|
size * (multiplierFn prefix);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,16 @@
|
|||||||
{ pkgs, lib, self }:
|
{ pkgs, lib, self }:
|
||||||
|
|
||||||
lib.runTests {
|
lib.runTests {
|
||||||
|
testToFloat = {
|
||||||
|
expr = self.trivial.toFloat 4;
|
||||||
|
expected = 4.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
testToFloat2 = {
|
||||||
|
expr = self.trivial.toFloat 5.5;
|
||||||
|
expected = 5.5;
|
||||||
|
};
|
||||||
|
|
||||||
testCountAttrs = {
|
testCountAttrs = {
|
||||||
expr = self.trivial.countAttrs (n: v: v?enable && v.enable) {
|
expr = self.trivial.countAttrs (n: v: v?enable && v.enable) {
|
||||||
hello.enable = true;
|
hello.enable = true;
|
||||||
@ -69,4 +79,55 @@ lib.runTests {
|
|||||||
expr = self.trivial.binaryPrefixMultiplier "G";
|
expr = self.trivial.binaryPrefixMultiplier "G";
|
||||||
expected = 1073741824;
|
expected = 1073741824;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
testParseBytesSizeIntoInt = {
|
||||||
|
expr = self.trivial.parseBytesSizeIntoInt "3GB";
|
||||||
|
expected = 3 * (self.trivial.metricPrefixMultiplier "G");
|
||||||
|
};
|
||||||
|
|
||||||
|
testParseBytesSizeIntoInt2 = {
|
||||||
|
expr = self.trivial.parseBytesSizeIntoInt "5MiB";
|
||||||
|
expected = 5 * (self.trivial.binaryPrefixMultiplier "M");
|
||||||
|
};
|
||||||
|
|
||||||
|
testParseBytesSizeIntoInt3 = {
|
||||||
|
expr = self.trivial.parseBytesSizeIntoInt "5MB";
|
||||||
|
expected = 5 * (self.trivial.metricPrefixMultiplier "M");
|
||||||
|
};
|
||||||
|
|
||||||
|
testParseBytesSizeIntoInt4 = {
|
||||||
|
expr = self.trivial.parseBytesSizeIntoInt "2 TiB";
|
||||||
|
expected = 2 * (self.trivial.binaryPrefixMultiplier "T");
|
||||||
|
};
|
||||||
|
|
||||||
|
testParseBytesSizeIntoInt5 = {
|
||||||
|
expr = self.trivial.parseBytesSizeIntoInt "2 Tib";
|
||||||
|
expected = 2 * (self.trivial.binaryPrefixMultiplier "T") / 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
testUnitsToInt = {
|
||||||
|
expr = self.trivial.unitsToInt {
|
||||||
|
size = 4.5;
|
||||||
|
prefix = "G";
|
||||||
|
type = "metric";
|
||||||
|
};
|
||||||
|
expected = 4500000000;
|
||||||
|
};
|
||||||
|
|
||||||
|
testUnitsToInt2 = {
|
||||||
|
expr = self.trivial.unitsToInt {
|
||||||
|
size = 4.5;
|
||||||
|
prefix = "G";
|
||||||
|
};
|
||||||
|
expected = 4831838208;
|
||||||
|
};
|
||||||
|
|
||||||
|
testUnitsToInt3 = {
|
||||||
|
expr = self.trivial.unitsToInt {
|
||||||
|
size = 532;
|
||||||
|
prefix = "M";
|
||||||
|
type = "metric";
|
||||||
|
};
|
||||||
|
expected = 532000000;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user