lib/strings: add a `toInt` helper (close #11242)

While the function itself is pretty easy, it's not straitforward to find a way to convert string to int with nix.
This commit is contained in:
Christian Zagrodnick 2015-11-24 10:00:44 +01:00 committed by Vladimír Čunát
parent 882344e480
commit 1cdacc6aa2
2 changed files with 24 additions and 6 deletions

View File

@ -223,4 +223,12 @@ rec {
# Check whether a value is a store path. # Check whether a value is a store path.
isStorePath = x: builtins.substring 0 1 (toString x) == "/" && dirOf (builtins.toPath x) == builtins.storeDir; isStorePath = x: builtins.substring 0 1 (toString x) == "/" && dirOf (builtins.toPath x) == builtins.storeDir;
# Convert string to int
# Obviously, it is a bit hacky to use fromJSON that way.
toInt = str:
let may_be_int = builtins.fromJSON str; in
if builtins.isInt may_be_int
then may_be_int
else throw "Could not convert ${str} to int.";
} }

View File

@ -7,7 +7,7 @@ runTests {
expr = id 1; expr = id 1;
expected = 1; expected = 1;
}; };
testConst = { testConst = {
expr = const 2 3; expr = const 2 3;
expected = 2; expected = 2;
@ -19,12 +19,12 @@ runTests {
expected = true; expected = true;
}; };
*/ */
testAnd = { testAnd = {
expr = and true false; expr = and true false;
expected = false; expected = false;
}; };
testFix = { testFix = {
expr = fix (x: {a = if x ? a then "a" else "b";}); expr = fix (x: {a = if x ? a then "a" else "b";});
expected = {a = "a";}; expected = {a = "a";};
@ -67,7 +67,7 @@ runTests {
}; };
testOverridableDelayableArgsTest = { testOverridableDelayableArgsTest = {
expr = expr =
let res1 = defaultOverridableDelayableArgs id {}; let res1 = defaultOverridableDelayableArgs id {};
res2 = defaultOverridableDelayableArgs id { a = 7; }; res2 = defaultOverridableDelayableArgs id { a = 7; };
res3 = let x = defaultOverridableDelayableArgs id { a = 7; }; res3 = let x = defaultOverridableDelayableArgs id { a = 7; };
@ -87,7 +87,7 @@ runTests {
in (x2.replace) { a = 10; }; # and override the value by 10 in (x2.replace) { a = 10; }; # and override the value by 10
# fixed tests (delayed args): (when using them add some comments, please) # fixed tests (delayed args): (when using them add some comments, please)
resFixed1 = resFixed1 =
let x = defaultOverridableDelayableArgs id ( x : { a = 7; c = x.fixed.b; }); let x = defaultOverridableDelayableArgs id ( x : { a = 7; c = x.fixed.b; });
y = x.merge (x : { name = "name-${builtins.toString x.fixed.c}"; }); y = x.merge (x : { name = "name-${builtins.toString x.fixed.c}"; });
in (y.merge) { b = 10; }; in (y.merge) { b = 10; };
@ -109,5 +109,15 @@ runTests {
expr = sort builtins.lessThan [ 40 2 30 42 ]; expr = sort builtins.lessThan [ 40 2 30 42 ];
expected = [2 30 40 42]; expected = [2 30 40 42];
}; };
testToIntShouldConvertStringToInt = {
expr = toInt "27";
expected = 27;
};
testToIntShouldThrowErrorIfItCouldNotConvertToInt = {
expr = builtins.tryEval (toInt "\"foo\"");
expected = { success = false; value = false; };
};
} }