add dict and nil
This commit is contained in:
parent
fb7a5b1cd2
commit
3f0d252442
3 changed files with 73 additions and 11 deletions
|
@ -18,6 +18,5 @@
|
||||||
type = "app";
|
type = "app";
|
||||||
program = toString runTests;
|
program = toString runTests;
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
37
lib.nix
37
lib.nix
|
@ -1,19 +1,46 @@
|
||||||
let
|
let
|
||||||
inherit (builtins) isString isFloat isInt isBool isList concatStringsSep;
|
inherit (builtins) isString isFloat isInt isBool isList isAttrs isNull;
|
||||||
|
inherit (builtins) concatStringsSep filter mapAttrs attrValues;
|
||||||
|
|
||||||
|
mkLuaNil = { _type = "nil"; };
|
||||||
|
isLuaNil = val: isAttrs val && val ? _type && val._type == "nil";
|
||||||
|
|
||||||
toLua = val:
|
toLua = val:
|
||||||
if isList val then toLuaList val
|
if isLuaNil val then "nil"
|
||||||
|
else if isAttrs val then toLuaDict val
|
||||||
|
else if isList val then toLuaList val
|
||||||
else if isString val then toLuaStr val
|
else if isString val then toLuaStr val
|
||||||
else if isFloat val || isInt val then toString val
|
else if isFloat val || isInt val then toString val
|
||||||
else if isBool val then toLuaBool val
|
else if isBool val then toLuaBool val
|
||||||
else "";
|
else if isNull val then null
|
||||||
|
else null;
|
||||||
|
|
||||||
toLuaList = val: "{ ${concatStringsSep ", " (map toLua val)} }";
|
toLuaList = val:
|
||||||
|
wrapObj (excludeNull (map toLua val));
|
||||||
|
|
||||||
toLuaStr = val: "'${val}'";
|
toLuaDict = val:
|
||||||
|
let
|
||||||
|
toDictItem = name: value:
|
||||||
|
let luaValue = toLua value;
|
||||||
|
in
|
||||||
|
if isNull luaValue then null
|
||||||
|
else "[${toLuaStr name}] = ${luaValue}";
|
||||||
|
|
||||||
|
dictItems = excludeNull (attrValues (mapAttrs toDictItem val));
|
||||||
|
in
|
||||||
|
wrapObj dictItems;
|
||||||
|
|
||||||
|
excludeNull = val: filter (v: !(isNull v)) val;
|
||||||
|
|
||||||
|
wrapObj = val: "{ ${concatStringsSep ", " val} }";
|
||||||
|
|
||||||
|
toLuaStr = val: "\"${val}\"";
|
||||||
|
|
||||||
toLuaBool = val: if val then "true" else "false";
|
toLuaBool = val: if val then "true" else "false";
|
||||||
|
|
||||||
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
inherit toLua;
|
inherit toLua;
|
||||||
|
inherit mkLuaNil;
|
||||||
}
|
}
|
||||||
|
|
46
lib.test.nix
46
lib.test.nix
|
@ -2,21 +2,29 @@
|
||||||
|
|
||||||
let
|
let
|
||||||
nix2lua = import ./lib.nix;
|
nix2lua = import ./lib.nix;
|
||||||
inherit (nix2lua) toLua;
|
inherit (nix2lua) toLua mkLuaNil;
|
||||||
in
|
in
|
||||||
pkgs.lib.runTests {
|
pkgs.lib.runTests {
|
||||||
"test returns an empty string" = {
|
"test returns null" = {
|
||||||
expr = toLua null;
|
expr = toLua null;
|
||||||
expected = "";
|
expected = null;
|
||||||
|
};
|
||||||
|
"test returns nil" = {
|
||||||
|
expr = toLua mkLuaNil;
|
||||||
|
expected = "nil";
|
||||||
};
|
};
|
||||||
"test returns a lua string" = {
|
"test returns a lua string" = {
|
||||||
expr = toLua "hello world";
|
expr = toLua "hello world";
|
||||||
expected = "'hello world'";
|
expected = "\"hello world\"";
|
||||||
};
|
};
|
||||||
"test returns an integer number" = {
|
"test returns an integer number" = {
|
||||||
expr = toLua 10;
|
expr = toLua 10;
|
||||||
expected = "10";
|
expected = "10";
|
||||||
};
|
};
|
||||||
|
"test returns a negative integer number" = {
|
||||||
|
expr = toLua (-10);
|
||||||
|
expected = "-10";
|
||||||
|
};
|
||||||
"test returns a float number" = {
|
"test returns a float number" = {
|
||||||
expr = toLua 10.1;
|
expr = toLua 10.1;
|
||||||
expected = "10.100000";
|
expected = "10.100000";
|
||||||
|
@ -31,6 +39,34 @@ pkgs.lib.runTests {
|
||||||
};
|
};
|
||||||
"test returns array with all primitive types" = {
|
"test returns array with all primitive types" = {
|
||||||
expr = toLua [ "hello" 10 10.1 true ];
|
expr = toLua [ "hello" 10 10.1 true ];
|
||||||
expected = "{ 'hello', 10, 10.100000, true }";
|
expected = "{ \"hello\", 10, 10.100000, true }";
|
||||||
|
};
|
||||||
|
"test returns array without null values" = {
|
||||||
|
expr = toLua [ null "hello" null 10 null 10.1 null true null ];
|
||||||
|
expected = "{ \"hello\", 10, 10.100000, true }";
|
||||||
|
};
|
||||||
|
"test returns dict" = {
|
||||||
|
expr = toLua {
|
||||||
|
foo = "hello";
|
||||||
|
int = 10;
|
||||||
|
float = 10.1;
|
||||||
|
success = true;
|
||||||
|
fail = false;
|
||||||
|
};
|
||||||
|
expected = "{ [\"fail\"] = false, [\"float\"] = 10.100000, [\"foo\"] = \"hello\", [\"int\"] = 10, [\"success\"] = true }";
|
||||||
|
};
|
||||||
|
"test returns dict without nullable items" = {
|
||||||
|
expr = toLua { foo = "hello"; bar = null; };
|
||||||
|
expected = "{ [\"foo\"] = \"hello\" }";
|
||||||
|
};
|
||||||
|
"test returns recursive dict" = {
|
||||||
|
expr = toLua {
|
||||||
|
first = {
|
||||||
|
second = {
|
||||||
|
last = "hello";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
expected = "{ [\"first\"] = { [\"second\"] = { [\"last\"] = \"hello\" } } }";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue