2023-04-18 01:01:45 +02:00
# Helpers for converting values to lua
2023-11-06 10:33:38 +01:00
{ lib }: let
inherit ( lib ) mapAttrsToList filterAttrs concatStringsSep concatMapStringsSep stringToCharacters boolToString ;
2024-02-17 21:55:07 +01:00
inherit ( builtins ) hasAttr head throw typeOf ;
2023-11-06 10:33:38 +01:00
in rec {
2023-06-04 13:12:08 +02:00
# Convert a null value to lua's nil
2023-04-18 01:01:45 +02:00
nullString = value :
if value == null
then " n i l "
else " ' ${ value } ' " ;
2023-06-04 13:12:08 +02:00
2023-06-05 20:37:12 +02:00
# convert an expression to lua
2023-06-04 16:36:01 +02:00
expToLua = exp :
if builtins . isList exp
2023-07-30 10:41:52 +02:00
then listToLuaTable exp # if list, convert to lua table
2023-06-04 16:36:01 +02:00
else if builtins . isAttrs exp
2023-07-30 10:41:52 +02: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 16:44:05 +01:00
else if exp == null
then " n i l "
2023-07-30 10:41:52 +02:00
else ( builtins . toJSON exp ) ; # otherwise jsonify the value and print as is
2023-06-04 16:36:01 +02:00
2023-06-05 20:37:12 +02:00
# convert list to a lua table
2023-06-04 16:36:01 +02:00
listToLuaTable = list :
" { " + ( builtins . concatStringsSep " , " ( map expToLua list ) ) + " } " ;
2023-06-04 13:12:08 +02:00
2023-06-05 20:37:12 +02:00
# convert attrset to a lua table
2023-06-04 13:12:08 +02:00
attrsetToLuaTable = attrset :
" { "
+ (
builtins . concatStringsSep " , "
2023-06-04 16:36:01 +02:00
(
lib . mapAttrsToList (
2023-06-04 13:12:08 +02:00
name : value :
2023-06-04 16:36:01 +02:00
name
+ " = "
+ ( expToLua value )
2023-06-04 13:12:08 +02:00
)
attrset
2023-06-04 16:36:01 +02:00
)
2023-06-04 13:12:08 +02:00
)
+ " } " ;
2023-10-24 09:18:44 +02: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 10:33:38 +01:00
toLuaObject = args :
if builtins . isAttrs args
then
if hasAttr " _ _ r a w " args
then args . __raw
else if hasAttr " _ _ e m p t y " 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 } "
2024-02-17 16:44:41 +01:00
else if ( args == null )
2023-11-06 10:33:38 +01:00
then " n i l "
2024-02-17 21:55:07 +01:00
else throw " c o u l d n o t c o n v e r t o b j e c t o f t y p e ` ${ typeOf args } ` t o l u a o b j e c t " ;
2023-04-18 01:01:45 +02:00
}