diff --git a/lib/strings.nix b/lib/strings.nix index 9cbd1494a2b5..e6df7d99cb2e 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -437,6 +437,13 @@ rec { */ fixedWidthNumber = width: n: fixedWidthString width "0" (toString n); + /* Check whether a value can be coerced to a string */ + isCoercibleToString = x: + builtins.elem (builtins.typeOf x) [ "path" "string" "null" "int" "float" "bool" ] || + (builtins.isList x && lib.all isCoercibleToString x) || + x ? outPath || + x ? __toString; + /* Check whether a value is a store path. Example: @@ -450,7 +457,7 @@ rec { => false */ isStorePath = x: - builtins.isString x + isCoercibleToString x && builtins.substring 0 1 (toString x) == "/" && dirOf (builtins.toPath x) == builtins.storeDir; diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 1657ec33a46c..e10aea48e48e 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -93,6 +93,7 @@ runTests { "${builtins.storeDir}/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11"; in { storePath = isStorePath goodPath; + storePathDerivation = isStorePath (import ../.. {}).hello; storePathAppendix = isStorePath "${goodPath}/bin/python"; nonAbsolute = isStorePath (concatStrings (tail (stringToCharacters goodPath))); @@ -106,6 +107,7 @@ runTests { }; expected = { storePath = true; + storePathDerivation = true; storePathAppendix = false; nonAbsolute = false; asPath = true;