{ lib }: with lib; rec { # Black functional magic that converts a bunch of different Nix types to their # lua equivalents! 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: let valueString = toLuaObject v; in if hasPrefix "__unkeyed" n then valueString else if hasPrefix "__rawKey__" n then ''[${removePrefix "__rawKey__" n}] = '' + valueString else if n == "__emptyString" then "[''] = " + valueString else "[${toLuaObject n}] = " + valueString ) (filterAttrs (n: 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) then "nil" else ""; }