feat(users/Profpatsch/netstring): add rust to_netstring

Change-Id: I539472fc9ebc3ebe6c34e01fde9c08d3e2e3558c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2431
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
This commit is contained in:
Profpatsch 2021-01-23 16:17:01 +01:00
parent ea9982d9ea
commit cc3f54a0ee
3 changed files with 47 additions and 22 deletions

View file

@ -36,12 +36,29 @@ let
return res
'';
rust-netstring = depot.users.Profpatsch.writers.rustSimpleLib {
name = "netstring";
} ''
pub fn to_netstring(s: &[u8]) -> Vec<u8> {
let len = s.len();
// length of the integer as ascii
let i_len = ((len as f64).log10() as usize) + 1;
let ns_len = i_len + 1 + len + 1;
let mut res = Vec::with_capacity(ns_len);
res.extend_from_slice(format!("{}:", len).as_bytes());
res.extend_from_slice(s);
res.push(b',');
res
}
'';
tests = import ./tests.nix {
inherit
depot
pkgs
lib
python-netstring
rust-netstring
toNetstring
toNetstringKeyVal
;
@ -52,6 +69,7 @@ in {
toNetstring
toNetstringKeyVal
python-netstring
rust-netstring
tests
;

View file

@ -1,14 +1,9 @@
{ depot, lib, pkgs, python-netstring, toNetstring, toNetstringKeyVal }:
{ depot, lib, pkgs, python-netstring, rust-netstring, toNetstring, toNetstringKeyVal }:
let
imports = {
inherit (depot.users.Profpatsch)
writers
;
};
python-netstring-test = imports.writers.python3 {
name = "python-netstring";
python-netstring-test = depot.users.Profpatsch.writers.python3 {
name = "python-netstring-test";
libraries = p: [
python-netstring
];
@ -36,11 +31,31 @@ let
),
{ b'foo': b'42', b'bar': b'hi' }
)
'';
rust-netstring-test = depot.users.Profpatsch.writers.rustSimple {
name = "rust-netstring-test";
dependencies = [
rust-netstring
];
} ''
extern crate netstring;
fn main() {
assert_eq!(
std::str::from_utf8(&netstring::to_netstring(b"hello")).unwrap(),
r##"${toNetstring "hello"}"##
);
assert_eq!(
std::str::from_utf8(&netstring::to_netstring("".as_bytes())).unwrap(),
r##"${toNetstring "こんにちは"}"##
);
}
'';
in {
inherit
python-netstring-test
rust-netstring-test
;
}

View file

@ -60,9 +60,13 @@ let
watch-file-modified = depot.users.Profpatsch.writers.rustSimple {
name = "watch-file-modified";
dependencies = [ depot.users.Profpatsch.rust-crates.inotify ];
dependencies = [
depot.users.Profpatsch.rust-crates.inotify
depot.users.Profpatsch.netstring.rust-netstring
];
} ''
extern crate inotify;
extern crate netstring;
use inotify::{EventMask, WatchMask, Inotify};
use std::io::Write;
@ -79,18 +83,6 @@ let
)
.expect("Failed to add inotify watch");
fn to_netstring(s: &[u8]) -> Vec<u8> {
let len = s.len();
// length of the integer as ascii
let i_len = ((len as f64).log10() as usize) + 1;
let ns_len = i_len + 1 + len + 1;
let mut res = Vec::with_capacity(ns_len);
res.extend_from_slice(format!("{}:", len).as_bytes());
res.extend_from_slice(s);
res.push(b',');
res
}
let mut buffer = [0u8; 4096];
loop {
let events = inotify
@ -99,7 +91,7 @@ let
for event in events {
if event.wd == file_watch {
std::io::stdout().write(&to_netstring(file.as_bytes()));
std::io::stdout().write(&netstring::to_netstring(file.as_bytes()));
std::io::stdout().flush();
}
}