to-edn/to-edn.nix

26 lines
651 B
Nix
Raw Normal View History

2022-05-30 15:13:25 -07:00
{ lib }:
with lib;
let
2022-05-30 16:12:58 -07:00
isSymbol = str: isNull (builtins.match "^'.+" str);
2022-05-30 16:14:18 -07:00
stripQuote = str: head (builtins.match "^'(.+)" str);
2022-05-30 15:42:27 -07:00
parseStr = str: if (isSymbol str) then (stripQuote str) else ''"${str}"'';
2022-05-30 15:13:25 -07:00
join-str = concatStringsSep " ";
toEDN = ds:
if isString ds then
2022-05-30 15:42:27 -07:00
parseStr ds
2022-05-30 15:13:25 -07:00
else
(if isInt ds then
ds
else
(if isList ds then
"[ ${join-str (map toEDN ds)} ]"
else
(if isAttrs ds then
2022-05-30 16:11:48 -07:00
"{ ${join-str (mapAttrsToList (k: v: ":${k} ${toEDN v}") ds)} }"
2022-05-30 15:13:25 -07:00
else
throw "unsupported type: ${builtins.typeOf ds}: ${ds}")));
2022-05-30 16:10:15 -07:00
in ds: toEDN ds