nvf/lib/lua.nix

89 lines
2.7 KiB
Nix
Raw Normal View History

# Helpers for converting values to lua
2023-11-06 09:33:38 +00:00
{lib}: let
inherit (lib) mapAttrsToList filterAttrs concatStringsSep concatMapStringsSep stringToCharacters boolToString;
inherit (builtins) hasAttr head throw typeOf;
2023-11-06 09:33:38 +00:00
in rec {
# Convert a null value to lua's nil
nullString = value:
if value == null
then "nil"
else "'${value}'";
2023-06-05 18:37:12 +00:00
# convert an expression to lua
2023-06-04 14:36:01 +00:00
expToLua = exp:
if builtins.isList exp
2023-07-30 08:41:52 +00:00
then listToLuaTable exp # if list, convert to lua table
2023-06-04 14:36:01 +00:00
else if builtins.isAttrs exp
2023-07-30 08:41:52 +00:00
then attrsetToLuaTable exp # if attrs, convert to table
else if builtins.isBool exp
then lib.boolToString exp # if bool, convert to string
else if builtins.isInt exp
then builtins.toString exp # if int, convert to string
2024-02-17 15:44:05 +00:00
else if exp == null
then "nil"
2023-07-30 08:41:52 +00:00
else (builtins.toJSON exp); # otherwise jsonify the value and print as is
2023-06-04 14:36:01 +00:00
2023-06-05 18:37:12 +00:00
# convert list to a lua table
2023-06-04 14:36:01 +00:00
listToLuaTable = list:
"{ " + (builtins.concatStringsSep ", " (map expToLua list)) + " }";
2023-06-05 18:37:12 +00:00
# convert attrset to a lua table
attrsetToLuaTable = attrset:
"{ "
+ (
builtins.concatStringsSep ", "
2023-06-04 14:36:01 +00:00
(
lib.mapAttrsToList (
name: value:
2023-06-04 14:36:01 +00:00
name
+ " = "
+ (expToLua value)
)
attrset
2023-06-04 14:36:01 +00:00
)
)
+ " }";
2023-10-24 07:18:44 +00:00
# Convert a list of lua expressions to a lua table. The difference to listToLuaTable is that the elements here are expected to be lua expressions already, whereas listToLuaTable converts from nix types to lua first
luaTable = items: ''{${builtins.concatStringsSep "," items}}'';
2023-11-06 09:33:38 +00:00
toLuaObject = args:
if builtins.isAttrs args
then
if hasAttr "__raw" args
then args.__raw
else if hasAttr "__empty" args
then "{ }"
else
"{"
+ (concatStringsSep ","
(mapAttrsToList
(n: v:
if head (stringToCharacters n) == "@"
then toLuaObject v
else "[${toLuaObject n}] = " + (toLuaObject v))
(filterAttrs
(
_: v:
(v != null) && (toLuaObject v != "{}")
)
args)))
+ "}"
else if builtins.isList args
then "{" + concatMapStringsSep "," toLuaObject args + "}"
else if builtins.isString args
then
# This should be enough!
builtins.toJSON args
else if builtins.isPath args
then builtins.toJSON (toString args)
else if builtins.isBool args
then "${boolToString args}"
else if builtins.isFloat args
then "${toString args}"
else if builtins.isInt args
then "${toString args}"
else if (args == null)
2023-11-06 09:33:38 +00:00
then "nil"
else throw "could not convert object of type `${typeOf args}` to lua object";
}