diff options
| author | Matt Sturgeon <matt@sturgeon.me.uk> | 2024-05-28 18:22:43 +0100 |
|---|---|---|
| committer | Matt Sturgeon <matt@sturgeon.me.uk> | 2024-07-25 23:43:33 +0100 |
| commit | aad87c2aa8d00fe8a9c4d8198cf166d652f8f28c (patch) | |
| tree | 393fab90dfcd7380d2d231fdbeed75d55e6547f5 /lib/strings.nix | |
| parent | Merge pull request #329788 from r-ryantm/auto-update/ants (diff) | |
| download | nixpkgs-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.nix | 62 |
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. |
