about summary refs log tree commit diff
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2021-01-23T15·17+0100
committerProfpatsch <mail@profpatsch.de>2021-01-23T15·33+0000
commitcc3f54a0eedb579c2ffd76f0505af0ccf940f9ff (patch)
tree7a0e5b734fb0760f49ab41fdd6f9129f84d7caa1
parentea9982d9eab50ee724eb1e5bae000911b219472f (diff)
feat(users/Profpatsch/netstring): add rust to_netstring r/2137
Change-Id: I539472fc9ebc3ebe6c34e01fde9c08d3e2e3558c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2431
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
-rw-r--r--users/Profpatsch/netstring/default.nix18
-rw-r--r--users/Profpatsch/netstring/tests.nix33
-rw-r--r--users/Profpatsch/tree-sitter.nix20
3 files changed, 48 insertions, 23 deletions
diff --git a/users/Profpatsch/netstring/default.nix b/users/Profpatsch/netstring/default.nix
index 35345978a318..3cf882d5a279 100644
--- a/users/Profpatsch/netstring/default.nix
+++ b/users/Profpatsch/netstring/default.nix
@@ -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
       ;
 
diff --git a/users/Profpatsch/netstring/tests.nix b/users/Profpatsch/netstring/tests.nix
index 0d4cee52766b..23141472d6a8 100644
--- a/users/Profpatsch/netstring/tests.nix
+++ b/users/Profpatsch/netstring/tests.nix
@@ -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
     ;
 }
diff --git a/users/Profpatsch/tree-sitter.nix b/users/Profpatsch/tree-sitter.nix
index 4a05c825bab4..099fa2d5b7b9 100644
--- a/users/Profpatsch/tree-sitter.nix
+++ b/users/Profpatsch/tree-sitter.nix
@@ -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();
                 }
             }