feat(nix): add basic netstring nix generation functions

Moving to toplevel so I can use them with `runExecline`. They should
be pretty atomic, and are proven to work (tests are still in my user
dir, since they test the producers indirectly via the python parser
and I don’t want to pull it out right now).

Change-Id: Id0baa3adcb2ec646458a104c7868c2889b8c64f5
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3054
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
This commit is contained in:
Profpatsch 2021-04-23 19:05:59 +02:00
parent c98dd8b352
commit 7e888c3c7b
4 changed files with 48 additions and 18 deletions

View file

@ -0,0 +1,33 @@
{ depot, lib, ... }:
# Convert an attrset of strings to a list of key/value netstring pairs.
# A good minimally viable json replacement if all you need is to iterate.
# You can use e.g. `forstdin -Ed '' item` in execline to split the items
# and then get the key and value via `multidefine -d '' $item { key value }`
#
# Example:
# { foo = "bar"; x = "abc"; }
# => "12:3:foo,3:bar,,10:1:x,3:abc,,"
#
# Example with runExecline:
# nix.runExecline "test" {
# stdin = nix.netstring.attrsToKeyValList {
# foo = "bar";
# x = "abc";
# };
# } [
# "forstdin" "-Ed" "" "item"
# "multidefine" "-d" "" "$item" [ "key" "value" ]
# "${pkgs.coreutils}/bin/echo" "\${key} -> \${value}"
# ]
# will print:
# foo -> bar
# x -> abc
attrs:
lib.concatStrings
(lib.mapAttrsToList
(k: v: depot.nix.netstring.fromString
( depot.nix.netstring.fromString k
+ depot.nix.netstring.fromString v))
attrs)

View file

@ -0,0 +1,10 @@
{ ... }:
# convert any nix string into a netstring
# (prefixed by its length) according to https://en.wikipedia.org/wiki/Netstring
#
# Examples:
# netstring.fromString "foo"
# => "3:foo,"
# netstring.fromString ""
# => "0:,"
s: "${toString (builtins.stringLength s)}:${s},"

View file

@ -1,14 +1,5 @@
{ lib, pkgs, depot, ... }: { lib, pkgs, depot, ... }:
let 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 { python-netstring = depot.users.Profpatsch.writers.python3Lib {
name = "netstring"; name = "netstring";
} '' } ''
@ -54,8 +45,6 @@ let
in depot.nix.utils.drvTargets { in depot.nix.utils.drvTargets {
inherit inherit
toNetstring
toNetstringKeyVal
python-netstring python-netstring
rust-netstring rust-netstring
; ;

View file

@ -3,8 +3,6 @@
let let
inherit (depot.users.Profpatsch.netstring) inherit (depot.users.Profpatsch.netstring)
toNetstring
toNetstringKeyVal
python-netstring python-netstring
rust-netstring rust-netstring
; ;
@ -21,20 +19,20 @@ let
assert left == right, "{} /= {}".format(str(left), str(right)) assert left == right, "{} /= {}".format(str(left), str(right))
assEq( assEq(
netstring.read_netstring(b"""${toNetstring "hi!"}"""), netstring.read_netstring(b"""${depot.nix.netstring.fromString "hi!"}"""),
(b"hi!", b"") (b"hi!", b"")
) )
assEq( assEq(
netstring.read_netstring_key_val( netstring.read_netstring_key_val(
b"""${toNetstringKeyVal { foo = "42"; }}""" b"""${depot.nix.netstring.attrsToKeyValList { foo = "42"; }}"""
), ),
(b'foo', b'42', b"") (b'foo', b'42', b"")
) )
assEq( assEq(
netstring.read_netstring_key_val_list( netstring.read_netstring_key_val_list(
b"""${toNetstringKeyVal { foo = "42"; bar = "hi"; }}""" b"""${depot.nix.netstring.attrsToKeyValList { foo = "42"; bar = "hi"; }}"""
), ),
{ b'foo': b'42', b'bar': b'hi' } { b'foo': b'42', b'bar': b'hi' }
) )
@ -51,11 +49,11 @@ let
fn main() { fn main() {
assert_eq!( assert_eq!(
std::str::from_utf8(&netstring::to_netstring(b"hello")).unwrap(), std::str::from_utf8(&netstring::to_netstring(b"hello")).unwrap(),
r##"${toNetstring "hello"}"## r##"${depot.nix.netstring.fromString "hello"}"##
); );
assert_eq!( assert_eq!(
std::str::from_utf8(&netstring::to_netstring("".as_bytes())).unwrap(), std::str::from_utf8(&netstring::to_netstring("".as_bytes())).unwrap(),
r##"${toNetstring "こんにちは"}"## r##"${depot.nix.netstring.fromString "こんにちは"}"##
); );
} }
''; '';