forked from mirrors/nixpkgs
lib/strings: Update toInt to handle intermixed ws and zeros. Added tests
This commit is contained in:
parent
febff1dccd
commit
3d196a5f2a
|
@ -802,16 +802,22 @@ rec {
|
|||
# Obviously, it is a bit hacky to use fromJSON this way.
|
||||
toInt = str:
|
||||
let
|
||||
strippedInput = match "[[:space:]]*(0*)(.*)" str;
|
||||
isNonZeroEmpty = match "[[:space:]]*" (lib.last strippedInput) == [];
|
||||
isZeroNonEmpty = head strippedInput != "";
|
||||
mayBeInt = fromJSON (lib.last strippedInput);
|
||||
# RegEx: Match any leading whitespace, then any zero padding, and capture any remaining
|
||||
# digits after that, and finally match any trailing whitespace.
|
||||
strippedInput = match "[[:space:]]*0*([[:digit:]]+)[[:space:]]*" str;
|
||||
|
||||
# RegEx: Match any leading whitespace, at least one '0', and any trailing whitespace.
|
||||
isZero = match "[[:space:]]*0+[[:space:]]*" str == [];
|
||||
|
||||
# Attempt to parse input
|
||||
parsedInput = fromJSON (elemAt strippedInput 0);
|
||||
in
|
||||
if isNonZeroEmpty && isZeroNonEmpty
|
||||
# Value is zero
|
||||
if isZero
|
||||
then 0
|
||||
else
|
||||
if isInt mayBeInt
|
||||
then mayBeInt
|
||||
if strippedInput != null && isInt parsedInput
|
||||
then parsedInput
|
||||
else throw "Could not convert ${str} to int.";
|
||||
|
||||
/* Read a list of paths from `file`, relative to the `rootPath`.
|
||||
|
|
|
@ -355,6 +355,17 @@ runTests {
|
|||
(0 == toInt " 000000 ")
|
||||
];
|
||||
|
||||
testToIntFails = testAllTrue [
|
||||
( builtins.tryEval (toInt "") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt "123 123") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt "0 123") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt " 0d ") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt " foo ") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt " foo 123 ") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt " foo 00123 ") == { success = false; value = false; } )
|
||||
( builtins.tryEval (toInt " foo00123 ") == { success = false; value = false; } )
|
||||
];
|
||||
|
||||
# LISTS
|
||||
|
||||
testFilter = {
|
||||
|
|
|
@ -162,7 +162,7 @@ checkConfigError 'A definition for option .* is not.*string or signed integer co
|
|||
# Check coerced value with unsound coercion
|
||||
checkConfigOutput '^12$' config.value ./declare-coerced-value-unsound.nix
|
||||
checkConfigError 'A definition for option .* is not of type .*. Definition values:\n\s*- In .*: "1000"' config.value ./declare-coerced-value-unsound.nix ./define-value-string-bigint.nix
|
||||
checkConfigError 'json.exception.parse_error' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix
|
||||
checkConfigError 'Could not convert .* to int.' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix
|
||||
|
||||
# Check mkAliasOptionModule.
|
||||
checkConfigOutput '^true$' config.enable ./alias-with-priority.nix
|
||||
|
|
Loading…
Reference in a new issue