summaryrefslogtreecommitdiff
path: root/lib/strings.nix
diff options
context:
space:
mode:
authorMatt Sturgeon <matt@sturgeon.me.uk>2024-05-28 18:22:43 +0100
committerMatt Sturgeon <matt@sturgeon.me.uk>2024-07-25 23:43:33 +0100
commitaad87c2aa8d00fe8a9c4d8198cf166d652f8f28c (patch)
tree393fab90dfcd7380d2d231fdbeed75d55e6547f5 /lib/strings.nix
parentMerge pull request #329788 from r-ryantm/auto-update/ants (diff)
downloadnixpkgs-aad87c2aa8d00fe8a9c4d8198cf166d652f8f28c.tar.gz
lib.strings: add `trim` and `trimWith`
`strings.trim` returns a copy of the string with all leading and trailing whitespace removed. `strings.trimWith` does the same thing, but calling code can decide whether to trim the start and/or end of the string.
Diffstat (limited to 'lib/strings.nix')
-rw-r--r--lib/strings.nix62
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/strings.nix b/lib/strings.nix
index 67bb669d04e0..18ef707750bb 100644
--- a/lib/strings.nix
+++ b/lib/strings.nix
@@ -157,6 +157,68 @@ rec {
*/
replicate = n: s: concatStrings (lib.lists.replicate n s);
+ /*
+ Remove leading and trailing whitespace from a string.
+
+ Whitespace is defined as any of the following characters:
+ " ", "\t" "\r" "\n"
+
+ Type: trim :: string -> string
+
+ Example:
+ trim " hello, world! "
+ => "hello, world!"
+ */
+ trim = trimWith {
+ start = true;
+ end = true;
+ };
+
+ /*
+ Remove leading and/or trailing whitespace from a string.
+
+ Whitespace is defined as any of the following characters:
+ " ", "\t" "\r" "\n"
+
+ Type: trimWith :: Attrs -> string -> string
+
+ Example:
+ trimWith { start = true; } " hello, world! "}
+ => "hello, world! "
+ trimWith { end = true; } " hello, world! "}
+ => " hello, world!"
+ */
+ trimWith =
+ {
+ # Trim leading whitespace
+ start ? false,
+ # Trim trailing whitespace
+ end ? false,
+ }:
+ s:
+ let
+ # Define our own whitespace character class instead of using
+ # `[:space:]`, which is not well-defined.
+ chars = " \t\r\n";
+
+ # To match up until trailing whitespace, we need to capture a
+ # group that ends with a non-whitespace character.
+ regex =
+ if start && end then
+ "[${chars}]*(.*[^${chars}])[${chars}]*"
+ else if start then
+ "[${chars}]*(.*)"
+ else if end then
+ "(.*[^${chars}])[${chars}]*"
+ else
+ "(.*)";
+
+ # If the string was empty or entirely whitespace,
+ # then the regex may not match and `res` will be `null`.
+ res = match regex s;
+ in
+ optionalString (res != null) (head res);
+
/* Construct a Unix-style, colon-separated search path consisting of
the given `subDir` appended to each of the given paths.