{ lib, ... }: with lib; { lua = {}: rec { type = with types; let valueType = nullOr (oneOf [ bool int float str (attrsOf valueType) (listOf valueType) ]) // { description = "Lua value"; }; in valueType; lib = { mkRaw = value: { inherit value; _type = "raw"; }; }; generate = value: let list = l: "{ ${concatMapStringsSep ", " generate l} }"; attrs = a: "{ ${concatStringsSep ", " (mapAttrsToList (name: value: "[${generate name}] = ${generate value}") a)} }"; in if value ? _type && value._type == "raw" then value.value else if isInt value then toString value else if isFloat value then toString value else if isString value then "'${escape [ "'" ] value }'" else if true == value then "true" else if false == value then "false" else if null == value then "nil" else if isList value then list value else if isAttrs value then attrs value else abort "Lua value not supported: ${toPretty value}"; }; }