nix-community.nixvim/lib/utils.nix

151 lines
3 KiB
Nix
Raw Normal View History

{
lib,
nixvimTypes,
_nixvimTests,
}:
2024-05-05 19:39:35 +02:00
with lib;
rec {
# Whether a string contains something other than whitespaces
hasContent = str: builtins.match "[[:space:]]*" str == null;
# Concatenate a list of strings, adding a newline at the end of each one,
# but skipping strings containing only whitespace characters
concatNonEmptyLines = lines: concatLines (builtins.filter hasContent lines);
2024-05-05 19:39:35 +02:00
listToUnkeyedAttrs =
list:
builtins.listToAttrs (lib.lists.imap0 (idx: lib.nameValuePair "__unkeyed-${toString idx}") list);
2024-01-25 16:58:58 +01:00
enableExceptInTests = !_nixvimTests;
2024-05-05 19:39:35 +02:00
emptyTable = {
"__empty" = null;
};
2024-01-25 16:58:58 +01:00
2024-05-31 10:14:48 +02:00
/**
Turn all the keys of an attrs into raw lua.
# Example
```nix
toRawKeys { foo = 1; bar = 2; }
=> { __rawKey__foo = 1; __rawKey__bar = 2; }
```
# Type
```
toRawKeys :: AttrSet -> AttrSet
```
*/
toRawKeys = mapAttrs' (n: v: nameValuePair "__rawKey__${n}" v);
/**
Create a 1-element attrs with a raw lua key.
# Example
```nix
mkRawKey "foo" 1
=> { __rawKey__foo = 1; }
```
# Type
```
mkRawKey :: String -> String -> AttrSet
```
# Arguments
- [n] The attribute name (raw lua)
- [v] The attribute value
*/
mkRawKey = n: v: toRawKeys { "${n}" = v; };
2024-01-31 09:52:00 +01:00
/*
2024-05-05 19:39:35 +02:00
Convert a string from camelCase to snake_case
Type: string -> string
2024-01-31 09:52:00 +01:00
*/
2024-05-05 19:39:35 +02:00
toSnakeCase =
let
splitByWords = builtins.split "([A-Z])";
processWord = s: if isString s then s else "_" + toLower (elemAt s 0);
in
string:
let
2024-01-31 09:52:00 +01:00
words = splitByWords string;
in
2024-05-05 19:39:35 +02:00
concatStrings (map processWord words);
2024-01-31 09:52:00 +01:00
/**
Capitalize a string by making the first character uppercase.
# Example
```nix
upperFirstChar "hello, world!"
=> "Hello, world!"
```
# Type
```
upperFirstChar :: String -> String
```
*/
upperFirstChar =
s:
let
first = substring 0 1 s;
rest = substring 1 (stringLength s) s;
result = (toUpper first) + rest;
in
optionalString (s != "") result;
2024-01-25 16:58:58 +01:00
mkIfNonNull' = x: y: (mkIf (x != null) y);
mkIfNonNull = x: (mkIfNonNull' x x);
2024-05-05 19:39:35 +02:00
ifNonNull' = x: y: if (x == null) then null else y;
2024-01-25 16:58:58 +01:00
mkRaw =
r:
if r == null || r == "" then
null
else if isString r then
{ __raw = r; }
else if nixvimTypes.isRawType r then
r
else
throw "mkRaw: invalid input: ${generators.toPretty { multiline = false; } r}";
2024-01-25 16:58:58 +01:00
wrapDo = string: ''
do
${string}
end
'';
# Wrap Vimscript for using in lua,
# but only if the string contains something other than whitespaces
# TODO: account for a possible ']]' in the string
wrapVimscriptForLua =
string:
optionalString (hasContent string) ''
vim.cmd([[
${string}
]])
'';
# Wrap lua script for using in Vimscript,
# but only if the string contains something other than whitespaces
# TODO: account for a possible 'EOF' if the string
wrapLuaForVimscript =
string:
optionalString (hasContent string) ''
lua << EOF
${string}
EOF
'';
2024-01-25 16:58:58 +01:00
}