From 4e14f5fee6a68ee5fb56d07e70e86fcfcebdc7d3 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Mon, 10 Jul 2023 21:16:25 +0200 Subject: lib.path.subpath.components: init Co-authored-by: Robert Hensing --- lib/path/default.nix | 31 +++++++++++++++++++++++++++++++ lib/path/tests/unit.nix | 13 +++++++++++++ 2 files changed, 44 insertions(+) (limited to 'lib/path') diff --git a/lib/path/default.nix b/lib/path/default.nix index 936e9b030253..181124c179a9 100644 --- a/lib/path/default.nix +++ b/lib/path/default.nix @@ -336,6 +336,37 @@ in /* No rec! Add dependencies on this file at the top. */ { ${subpathInvalidReason path}'' ) 0 subpaths; + /* + Split [a subpath](#function-library-lib.path.subpath.isValid) into its path component strings. + Throw an error if the subpath isn't valid. + Note that the returned path components are also valid subpath strings, though they are intentionally not [normalised](#function-library-lib.path.subpath.normalise). + + Laws: + + - Splitting a subpath into components and [joining](#function-library-lib.path.subpath.join) the components gives the same subpath but [normalised](#function-library-lib.path.subpath.normalise): + + subpath.join (subpath.components s) == subpath.normalise s + + Type: + subpath.components :: String -> [ String ] + + Example: + subpath.components "." + => [ ] + + subpath.components "./foo//bar/./baz/" + => [ "foo" "bar" "baz" ] + + subpath.components "/foo" + => + */ + subpath.components = + subpath: + assert assertMsg (isValid subpath) '' + lib.path.subpath.components: Argument is not a valid subpath string: + ${subpathInvalidReason subpath}''; + splitRelPath subpath; + /* Normalise a subpath. Throw an error if the subpath isn't valid, see `lib.path.subpath.isValid` diff --git a/lib/path/tests/unit.nix b/lib/path/tests/unit.nix index 9c5b752cf64a..fc5a84493adb 100644 --- a/lib/path/tests/unit.nix +++ b/lib/path/tests/unit.nix @@ -204,6 +204,19 @@ let expr = (builtins.tryEval (subpath.normalise "..")).success; expected = false; }; + + testSubpathComponentsExample1 = { + expr = subpath.components "."; + expected = [ ]; + }; + testSubpathComponentsExample2 = { + expr = subpath.components "./foo//bar/./baz/"; + expected = [ "foo" "bar" "baz" ]; + }; + testSubpathComponentsExample3 = { + expr = (builtins.tryEval (subpath.components "/foo")).success; + expected = false; + }; }; in if cases == [] then "Unit tests successful" -- cgit 1.4.1