feat(Profpatsch): add netstring helper function & python lib
Simple helper function to generate a netstring that is a list of key-value pairs, to serialize a nix dict. Also adds a python lib to read the serialized form into a dict again. Change-Id: I306c0cfd51640c0658d32c8d3a4f3d332ba448f0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2315 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
baab2ce359
commit
e219c13328
2 changed files with 103 additions and 0 deletions
58
users/Profpatsch/netstring/default.nix
Normal file
58
users/Profpatsch/netstring/default.nix
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
{ lib, pkgs, depot, ... }:
|
||||
let
|
||||
toNetstring = s:
|
||||
"${toString (builtins.stringLength s)}:${s},";
|
||||
|
||||
toNetstringKeyVal = attrs:
|
||||
lib.concatStrings
|
||||
(lib.mapAttrsToList
|
||||
(k: v: toNetstring (toNetstring k + toNetstring v))
|
||||
attrs);
|
||||
|
||||
python-netstring = depot.users.Profpatsch.writers.python3Lib {
|
||||
name = "netstring";
|
||||
} ''
|
||||
def read_netstring(bytes):
|
||||
(int_length, rest) = bytes.split(sep=b':', maxsplit=1)
|
||||
val = rest[:int(int_length)]
|
||||
# has to end on a ,
|
||||
assert(rest[len(val)] == ord(','))
|
||||
return (val, rest[len(val) + 1:])
|
||||
|
||||
def read_netstring_key_val(bytes):
|
||||
(keyvalnet, rest) = read_netstring(bytes)
|
||||
(key, valnet) = read_netstring(keyvalnet)
|
||||
(val, nothing) = read_netstring(valnet)
|
||||
assert(nothing == b"")
|
||||
return (key, val, rest)
|
||||
|
||||
def read_netstring_key_val_list(bytes):
|
||||
rest = bytes
|
||||
res = {}
|
||||
while rest != b"":
|
||||
(key, val, r) = read_netstring_key_val(rest)
|
||||
rest = r
|
||||
res[key] = val
|
||||
return res
|
||||
'';
|
||||
|
||||
tests = import ./tests.nix {
|
||||
inherit
|
||||
depot
|
||||
pkgs
|
||||
lib
|
||||
python-netstring
|
||||
toNetstring
|
||||
toNetstringKeyVal
|
||||
;
|
||||
};
|
||||
|
||||
in {
|
||||
inherit
|
||||
toNetstring
|
||||
toNetstringKeyVal
|
||||
python-netstring
|
||||
tests
|
||||
;
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue