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:
parent
c98dd8b352
commit
7e888c3c7b
4 changed files with 48 additions and 18 deletions
33
nix/netstring/attrsToKeyValList.nix
Normal file
33
nix/netstring/attrsToKeyValList.nix
Normal 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)
|
10
nix/netstring/fromString.nix
Normal file
10
nix/netstring/fromString.nix
Normal 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},"
|
|
@ -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
|
||||||
;
|
;
|
||||||
|
|
|
@ -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 "こんにちは"}"##
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
|
Loading…
Reference in a new issue