59 lines
1.3 KiB
Nix
59 lines
1.3 KiB
Nix
|
{ 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
|
||
|
;
|
||
|
|
||
|
}
|