tvl-depot/users/Profpatsch/netencode/gen.nix
Profpatsch 8ff77f0b9f fix(users/Profpatsch/netencode/gen: fix number generator
Shouldn’t use the netstring function, since that adds the length of
the containing string, which doesn’t make sense for numbers, they just
have their one length number and content.

Change-Id: I5591f6dd59154c5ef38d6e9b7300d19884a2d57b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2497
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
2021-02-09 01:36:27 +00:00

65 lines
1.1 KiB
Nix

{ lib }:
let
netstring = tag: suffix: s:
"${tag}${toString (builtins.stringLength s)}:${s}${suffix}";
unit = "u,";
n1 = b: if b then "n1:1," else "n1:0,";
n = i: n: "n${toString i}:${toString n},";
i = i: n: "i${toString i}:${toString n},";
n3 = n 3;
n6 = n 6;
n7 = n 7;
i3 = i 3;
i6 = i 6;
i7 = i 7;
text = netstring "t" ",";
binary = netstring "b" ",";
tag = key: val: netstring "<" "|" key + val;
concatStrings = builtins.concatStringsSep "";
record = lokv: netstring "{" "}"
(concatStrings (map ({key, val}: tag key val) lokv));
list = l: netstring "[" "]" (concatStrings l);
dwim = val:
let match = {
"bool" = n1;
"int" = i6;
"string" = text;
"set" = attrs: record (lib.mapAttrsToList
(k: v: {
key = k;
val = dwim v;
}) attrs);
"list" = l: list (map dwim l);
};
in match.${builtins.typeOf val} val;
in {
inherit
unit
n1
n3
n6
n7
i3
i6
i7
text
binary
tag
record
list
dwim
;
}