nix2lua/lib.nix

53 lines
1.4 KiB
Nix
Raw Normal View History

2022-11-18 02:36:55 +03:00
let
2022-11-18 12:40:18 +03:00
inherit (builtins) isString isFloat isInt isBool isList isAttrs isNull;
inherit (builtins) concatStringsSep filter mapAttrs attrValues;
mkLuaNil = { _type = "nil"; };
2022-11-18 22:46:17 +03:00
isLuaNil = val: getType val == "nil";
mkDictItem = name: value: {
_type = "dict_item";
name = validString name;
value = toLua value;
};
isDictItem = val: getType val == "dict_item";
toLuaDictItem = name: value:
if isNull value then null
else "[${toLuaStr name}] = ${value}";
2022-11-18 02:36:55 +03:00
toLua = val:
2022-11-18 12:40:18 +03:00
if isLuaNil val then "nil"
2022-11-18 22:46:17 +03:00
else if isDictItem val then toLuaDictItem val.name val.value
2022-11-18 12:40:18 +03:00
else if isAttrs val then toLuaDict val
else if isList val then toLuaList val
2022-11-18 02:36:55 +03:00
else if isString val then toLuaStr val
else if isFloat val || isInt val then toString val
else if isBool val then toLuaBool val
2022-11-18 12:40:18 +03:00
else if isNull val then null
else null;
toLuaList = val:
wrapObj (excludeNull (map toLua val));
2022-11-18 22:46:17 +03:00
toLuaDict = val: toLua (attrValues (mapAttrs mkDictItem val));
2022-11-18 02:36:55 +03:00
2022-11-18 12:40:18 +03:00
excludeNull = val: filter (v: !(isNull v)) val;
2022-11-18 02:36:55 +03:00
2022-11-18 12:40:18 +03:00
wrapObj = val: "{ ${concatStringsSep ", " val} }";
2022-11-18 22:46:17 +03:00
toLuaStr = val: "\"${validString val}\"";
2022-11-18 02:36:55 +03:00
toLuaBool = val: if val then "true" else "false";
2022-11-18 12:40:18 +03:00
2022-11-18 22:46:17 +03:00
getType = val: if isAttrs val && val ? _type then val._type else null;
validString = value:
if isString value then value
else throw "Value '${toString value}' is not a valid string";
2022-11-18 12:40:18 +03:00
2022-11-18 02:36:55 +03:00
in
{
inherit toLua;
2022-11-18 22:46:17 +03:00
inherit mkLuaNil mkDictItem;
2022-11-18 02:36:55 +03:00
}