From e42d73e3ff8250c5c35e1d398ac7076ce682b9d3 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Wed, 28 Feb 2024 23:40:47 +0300 Subject: [PATCH] some cleanup --- lib.nix | 54 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/lib.nix b/lib.nix index f8bc905..1f483bf 100644 --- a/lib.nix +++ b/lib.nix @@ -18,10 +18,23 @@ let inherit (builtins) isString isFloat isInt isBool isList isAttrs isNull isPath; inherit (builtins) concatStringsSep filter mapAttrs attrValues; - error = message: throw "[nix2lua] ${message}"; + ################################################################################ + # Utils + ################################################################################ + error = message: throw "[nix2lua] ${message}"; warn = msg: builtins.trace "[nix2lua] warning: ${msg}"; + getType = expr: if isAttrs expr && expr ? _type then expr._type else null; + + validString = expr: + if isString expr || isPath expr then toString expr + else error "Value '${toString expr}' is not a valid string"; + + ################################################################################ + # Low-Level + ################################################################################ + isJoin = expr: getType expr == "_join"; join = sep: expr: if isList expr then { _type = "_join"; sep = validString sep; parts = expr; } @@ -31,7 +44,7 @@ let mkLuaRaw = expr: if isLuaRaw expr then { _type = "raw"; raw = expr.raw; } - else if isString expr || isLuaRaw expr then + else if isString expr then { _type = "raw"; raw = expr; } else error "Value '${toString expr}' is not supported for a raw type"; @@ -48,12 +61,23 @@ let ++ [ (mkLuaRaw ")") ] ); + toLuaStr = expr: "\"${validString expr}\""; + toLuaBool = expr: if expr then "true" else "false"; + isLuaNil = expr: getType expr == "nil"; LuaNil = { _type = "nil"; }; - # DEPRECATED mkLuaNil = warn "`mkLuaNil` is deprecated. Use `LuaNil` instead" LuaNil; + toLuaList = onValue: expr: + let + wrapObj = expr: "{ ${concatStringsSep ", " expr} }"; + excludeNull = expr: filter (v: !(isNull v)) expr; + in + wrapObj (excludeNull (map onValue expr)); + + toLuaTable = onValue: expr: onValue (attrValues (mapAttrs mkNamedField expr)); + mkNamedField = name: expr: { _type = "table_field"; name = validString name; @@ -64,8 +88,6 @@ let if isNull expr then null else "[${toLuaStr name}] = ${expr}"; - toLua = val: toLuaInternal 0 val; - toLuaInternal = depth: expr: let nextDepth = depth + 1; in if isJoin expr then concatStringsSep expr.sep (map (toLuaInternal depth) expr.parts) @@ -74,32 +96,16 @@ let else if isNamedField expr then if depth > 0 then toLuaNamedField expr.name expr.value else error "You cannot render table field at the top level" - else if isAttrs expr then toLuaTable nextDepth expr - else if isList expr then toLuaList nextDepth expr + else if isAttrs expr then toLuaTable (toLuaInternal nextDepth) expr + else if isList expr then toLuaList (toLuaInternal nextDepth) expr else if isString expr || isPath expr then toLuaStr expr else if isFloat expr || isInt expr then toString expr else if isBool expr then toLuaBool expr else if isNull expr then null else error "Value '${toString expr}' is not supported yet"; - toLuaList = depth: expr: - wrapObj (excludeNull (map (toLuaInternal depth) expr)); + toLua = val: toLuaInternal 0 val; - toLuaTable = depth: expr: toLuaInternal depth (attrValues (mapAttrs mkNamedField expr)); - - excludeNull = expr: filter (v: !(isNull v)) expr; - - wrapObj = expr: "{ ${concatStringsSep ", " expr} }"; - - toLuaStr = expr: "\"${validString expr}\""; - - toLuaBool = expr: if expr then "true" else "false"; - - getType = expr: if isAttrs expr && expr ? _type then expr._type else null; - - validString = expr: - if isString expr || isPath expr then toString expr - else error "Value '${toString expr}' is not a valid string"; in { # low-level