about summary refs log tree commit diff
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2021-04-23T20·04+0200
committerProfpatsch <mail@profpatsch.de>2021-04-24T10·23+0000
commiteb41eef6127216543d8b28c9c423ac1be0a4ee24 (patch)
treec01e67c4062711b3623841e8e56791ec8a14edc1
parent7e888c3c7bb36f6ab6e83d4a6f6a755ff4156791 (diff)
chore(nix): move rustSimple from users.Profpatsch.writers r/2547
I think it’s solid enough to use in a wider context.

Change-Id: If53e8bbb6b90fa88d73fb42730db470e822ea182
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3055
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
Reviewed-by: lukegb <lukegb@tvl.fyi>
-rw-r--r--nix/writers/default.nix97
-rw-r--r--nix/writers/tests/rust.nix68
-rw-r--r--users/Profpatsch/arglib/netencode.nix2
-rw-r--r--users/Profpatsch/execline/default.nix2
-rw-r--r--users/Profpatsch/imap-idle.nix2
-rw-r--r--users/Profpatsch/netencode/default.nix19
-rw-r--r--users/Profpatsch/netstring/default.nix2
-rw-r--r--users/Profpatsch/netstring/tests/default.nix11
-rw-r--r--users/Profpatsch/read-http.nix2
-rw-r--r--users/Profpatsch/tree-sitter.nix4
-rw-r--r--users/Profpatsch/writers/default.nix80
-rw-r--r--users/Profpatsch/writers/tests/default.nix49
-rw-r--r--users/sterni/nint/default.nix2
-rw-r--r--users/sterni/nix/utf8/tests/default.nix2
14 files changed, 184 insertions, 158 deletions
diff --git a/nix/writers/default.nix b/nix/writers/default.nix
new file mode 100644
index 0000000000..f43761865f
--- /dev/null
+++ b/nix/writers/default.nix
@@ -0,0 +1,97 @@
+{ depot, pkgs, lib, ... }:
+
+let
+  bins = depot.nix.getBins pkgs.s6-portable-utils [ "s6-ln" "s6-ls" "s6-touch" ]
+    ;
+
+  linkTo = name: path: depot.nix.runExecline.local name {} [
+    "importas" "out" "out"
+    bins.s6-ln "-s" path "$out"
+  ];
+
+  # Build a rust executable.
+  # Takes all arguments that `pkgs.buildRustCrate` accepts.
+  # Rather leaky abstraction.
+  rustSimple = args@{name, ...}: src:
+    linkTo name "${rustSimpleBin args src}/bin/${name}";
+
+  # Like `rustSimple`, but put the binary in `$out/bin/`.
+  rustSimpleBin = {
+    name,
+    dependencies ? [],
+    doCheck ? true,
+    ...
+  }@args: src:
+    (if doCheck then testRustSimple else pkgs.lib.id)
+    (pkgs.buildRustCrate ({
+      pname = name;
+      version = "1.0.0";
+      crateName = name;
+      crateBin = [ name ];
+      dependencies = dependencies;
+      src = pkgs.runCommandLocal "write-main.rs" {
+        src = src;
+        passAsFile = [ "src" ];
+      } ''
+        mkdir -p $out/src/bin
+        cp "$srcPath" $out/src/bin/${name}.rs
+        find $out
+      '';
+    } // args));
+
+  # Build a rust library, that can be used as dependency to `rustSimple`.
+  # Wrapper around `pkgs.buildRustCrate`, takes all its arguments.
+  rustSimpleLib = {
+    name,
+    dependencies ? [],
+    doCheck ? true,
+    ...
+  }@args: src:
+    (if doCheck then testRustSimple else pkgs.lib.id)
+    (pkgs.buildRustCrate ({
+      pname = name;
+      version = "1.0.0";
+      crateName = name;
+      dependencies = dependencies;
+      src = pkgs.runCommandLocal "write-lib.rs" {
+        src = src;
+        passAsFile = [ "src" ];
+      } ''
+        mkdir -p $out/src
+        cp "$srcPath" $out/src/lib.rs
+        find $out
+      '';
+    } // args));
+
+  /* Takes a `buildRustCrate` derivation as an input,
+    * builds it with `{ buildTests = true; }` and runs
+    * all tests found in its `tests` dir. If they are
+    * all successful, `$out` will point to the crate
+    * built with `{ buildTests = false; }`, otherwise
+    * it will fail to build.
+    *
+    * See also `nix.drvSeqL` which is used to implement
+    * this behavior.
+    */
+  testRustSimple = rustDrv:
+    let
+      crate = buildTests: rustDrv.override { inherit buildTests; };
+      tests = depot.nix.runExecline.local "${rustDrv.name}-tests-run" {} [
+        "importas" "out" "out"
+        "if" [
+          "pipeline" [ bins.s6-ls "${crate true}/tests" ]
+          "forstdin" "-o0" "test"
+          "importas" "test" "test"
+          "${crate true}/tests/$test"
+        ]
+        bins.s6-touch "$out"
+      ];
+    in depot.nix.drvSeqL [ tests ] (crate false);
+
+in {
+  inherit
+    rustSimple
+    rustSimpleBin
+    rustSimpleLib
+    ;
+}
diff --git a/nix/writers/tests/rust.nix b/nix/writers/tests/rust.nix
new file mode 100644
index 0000000000..4b87676118
--- /dev/null
+++ b/nix/writers/tests/rust.nix
@@ -0,0 +1,68 @@
+{ depot, pkgs, ... }:
+
+let
+  inherit (depot.nix.writers)
+    rustSimple
+    rustSimpleLib
+    rustSimpleBin
+    ;
+
+  inherit (pkgs)
+    coreutils
+    ;
+
+  run = drv: depot.nix.runExecline.local "run-${drv.name}" {} [
+    "if" [ drv ]
+    "importas" "out" "out"
+    "${coreutils}/bin/touch" "$out"
+  ];
+
+  rustTransitiveLib = rustSimpleLib {
+    name = "transitive";
+  } ''
+    pub fn transitive(s: &str) -> String {
+      let mut new = s.to_string();
+      new.push_str(" 1 2 3");
+      new
+    }
+
+    #[cfg(test)]
+    mod tests {
+      use super::*;
+
+      #[test]
+      fn test_transitive() {
+        assert_eq!(transitive("foo").as_str(), "foo 1 2 3")
+      }
+    }
+  '';
+
+  rustTestLib = rustSimpleLib {
+    name = "test_lib";
+    dependencies = [ rustTransitiveLib ];
+  } ''
+    extern crate transitive;
+    use transitive::{transitive};
+    pub fn test() -> String {
+      transitive("test")
+    }
+  '';
+
+  rustWithLib = run (rustSimple {
+    name = "rust-with-lib";
+    dependencies = [ rustTestLib ];
+  } ''
+    extern crate test_lib;
+
+    fn main() {
+      assert_eq!(test_lib::test(), String::from("test 1 2 3"));
+    }
+  '');
+
+
+in depot.nix.utils.drvTargets {
+  inherit
+    rustTransitiveLib
+    rustWithLib
+    ;
+}
diff --git a/users/Profpatsch/arglib/netencode.nix b/users/Profpatsch/arglib/netencode.nix
index 6b568ab80d..7712bbd5bb 100644
--- a/users/Profpatsch/arglib/netencode.nix
+++ b/users/Profpatsch/arglib/netencode.nix
@@ -2,7 +2,7 @@
 
 let
   netencode = {
-    rust = depot.users.Profpatsch.writers.rustSimpleLib {
+    rust = depot.nix.writers.rustSimpleLib {
       name = "arglib-netencode";
       dependencies = [
         depot.users.Profpatsch.execline.exec-helpers
diff --git a/users/Profpatsch/execline/default.nix b/users/Profpatsch/execline/default.nix
index c852b82a86..2d1b911373 100644
--- a/users/Profpatsch/execline/default.nix
+++ b/users/Profpatsch/execline/default.nix
@@ -1,7 +1,7 @@
 { depot, pkgs, lib, ... }:
 
 let
-  exec-helpers = depot.users.Profpatsch.writers.rustSimpleLib {
+  exec-helpers = depot.nix.writers.rustSimpleLib {
     name = "exec-helpers";
   } (builtins.readFile ./exec_helpers.rs);
 
diff --git a/users/Profpatsch/imap-idle.nix b/users/Profpatsch/imap-idle.nix
index afd033533f..3ad5375d89 100644
--- a/users/Profpatsch/imap-idle.nix
+++ b/users/Profpatsch/imap-idle.nix
@@ -1,7 +1,7 @@
 { depot, pkgs, lib, ... }:
 
 let
-  imap-idle = depot.users.Profpatsch.writers.rustSimple {
+  imap-idle = depot.nix.writers.rustSimple {
     name = "imap-idle";
     dependencies = [
       depot.users.Profpatsch.arglib.netencode.rust
diff --git a/users/Profpatsch/netencode/default.nix b/users/Profpatsch/netencode/default.nix
index 33209276f9..6662e622e1 100644
--- a/users/Profpatsch/netencode/default.nix
+++ b/users/Profpatsch/netencode/default.nix
@@ -1,12 +1,7 @@
 { depot, pkgs, lib, ... }:
 
 let
-  imports = {
-    inherit (depot.users.Profpatsch)
-      writers;
-  };
-
-  netencode-rs = imports.writers.rustSimpleLib {
+  netencode-rs = depot.nix.writers.rustSimpleLib {
       name = "netencode";
       dependencies = [
         depot.third_party.rust-crates.nom
@@ -18,14 +13,14 @@ let
 
   gen = import ./gen.nix { inherit lib; };
 
-  pretty-rs = imports.writers.rustSimpleLib {
+  pretty-rs = depot.nix.writers.rustSimpleLib {
     name = "netencode-pretty";
     dependencies = [
       netencode-rs
     ];
   } (builtins.readFile ./pretty.rs);
 
-  pretty = depot.users.Profpatsch.writers.rustSimple {
+  pretty = depot.nix.writers.rustSimple {
     name = "netencode-pretty";
     dependencies = [
       netencode-rs
@@ -48,7 +43,7 @@ let
     }
   '';
 
-  netencode-mustache = imports.writers.rustSimple {
+  netencode-mustache = depot.nix.writers.rustSimple {
     name = "netencode_mustache";
     dependencies = [
       depot.users.Profpatsch.arglib.netencode.rust
@@ -58,7 +53,7 @@ let
   } (builtins.readFile ./netencode-mustache.rs);
 
 
-  record-get = imports.writers.rustSimple {
+  record-get = depot.nix.writers.rustSimple {
     name = "record-get";
     dependencies = [
       netencode-rs
@@ -87,7 +82,7 @@ let
     }
   '';
 
-  record-splice-env = imports.writers.rustSimple {
+  record-splice-env = depot.nix.writers.rustSimple {
     name = "record-splice-env";
     dependencies = [
       netencode-rs
@@ -116,7 +111,7 @@ let
     }
   '';
 
-  env-splice-record = imports.writers.rustSimple {
+  env-splice-record = depot.nix.writers.rustSimple {
     name = "env-splice-record";
     dependencies = [
       netencode-rs
diff --git a/users/Profpatsch/netstring/default.nix b/users/Profpatsch/netstring/default.nix
index 333244a0f7..2b21cde388 100644
--- a/users/Profpatsch/netstring/default.nix
+++ b/users/Profpatsch/netstring/default.nix
@@ -27,7 +27,7 @@ let
         return res
   '';
 
-  rust-netstring = depot.users.Profpatsch.writers.rustSimpleLib {
+  rust-netstring = depot.nix.writers.rustSimpleLib {
     name = "netstring";
   } ''
     pub fn to_netstring(s: &[u8]) -> Vec<u8> {
diff --git a/users/Profpatsch/netstring/tests/default.nix b/users/Profpatsch/netstring/tests/default.nix
index b9fb5835e5..f64beb9e92 100644
--- a/users/Profpatsch/netstring/tests/default.nix
+++ b/users/Profpatsch/netstring/tests/default.nix
@@ -2,15 +2,10 @@
 
 let
 
-  inherit (depot.users.Profpatsch.netstring)
-    python-netstring
-    rust-netstring
-    ;
-
   python-netstring-test = depot.users.Profpatsch.writers.python3 {
     name = "python-netstring-test";
     libraries = p: [
-      python-netstring
+      depot.users.Profpatsch.netstring.python-netstring
     ];
   } ''
     import netstring
@@ -38,10 +33,10 @@ let
     )
   '';
 
-  rust-netstring-test = depot.users.Profpatsch.writers.rustSimple {
+  rust-netstring-test = depot.nix.writers.rustSimple {
     name = "rust-netstring-test";
     dependencies = [
-      rust-netstring
+      depot.users.Profpatsch.netstring.rust-netstring
     ];
   } ''
     extern crate netstring;
diff --git a/users/Profpatsch/read-http.nix b/users/Profpatsch/read-http.nix
index 2b7465dab8..854a11b7d0 100644
--- a/users/Profpatsch/read-http.nix
+++ b/users/Profpatsch/read-http.nix
@@ -2,7 +2,7 @@
 
 let
 
-  read-http = depot.users.Profpatsch.writers.rustSimple {
+  read-http = depot.nix.writers.rustSimple {
     name = "read-http";
     dependencies = [
       depot.third_party.rust-crates.ascii
diff --git a/users/Profpatsch/tree-sitter.nix b/users/Profpatsch/tree-sitter.nix
index 101ee03d4f..1e3f378019 100644
--- a/users/Profpatsch/tree-sitter.nix
+++ b/users/Profpatsch/tree-sitter.nix
@@ -6,7 +6,7 @@ let
       // depot.nix.getBins pkgs.bc [ "bc" ]
       // depot.nix.getBins pkgs.ocamlPackages.sexp [ "sexp" ];
 
-  print-ast = depot.users.Profpatsch.writers.rustSimple {
+  print-ast = depot.nix.writers.rustSimple {
     name = "print-ast";
     dependencies = with depot.third_party.rust-crates; [
       libloading
@@ -58,7 +58,7 @@ let
     };
   };
 
-  watch-file-modified = depot.users.Profpatsch.writers.rustSimple {
+  watch-file-modified = depot.nix.writers.rustSimple {
     name = "watch-file-modified";
     dependencies = [
       depot.third_party.rust-crates.inotify
diff --git a/users/Profpatsch/writers/default.nix b/users/Profpatsch/writers/default.nix
index 3cb105b5ed..3151a9d3bd 100644
--- a/users/Profpatsch/writers/default.nix
+++ b/users/Profpatsch/writers/default.nix
@@ -67,90 +67,10 @@ let
       doCheck = false;
     };
 
-  rustSimple = args@{name, ...}: src:
-    linkTo name "${rustSimpleBin args src}/bin/${name}";
-
-  linkTo = name: path: depot.nix.runExecline.local name {} [
-    "importas" "out" "out"
-    bins.s6-ln "-s" path "$out"
-  ];
-
-  rustSimpleBin = {
-    name,
-    dependencies ? [],
-    doCheck ? true,
-    ...
-  }@args: src:
-    (if doCheck then testRustSimple else pkgs.lib.id)
-    (pkgs.buildRustCrate ({
-      pname = name;
-      version = "1.0.0";
-      crateName = name;
-      crateBin = [ name ];
-      dependencies = dependencies;
-      src = pkgs.runCommandLocal "write-main.rs" {
-        src = src;
-        passAsFile = [ "src" ];
-      } ''
-        mkdir -p $out/src/bin
-        cp "$srcPath" $out/src/bin/${name}.rs
-        find $out
-      '';
-    } // args));
-
-  rustSimpleLib = {
-    name,
-    dependencies ? [],
-    doCheck ? true,
-    ...
-  }@args: src:
-    (if doCheck then testRustSimple else pkgs.lib.id)
-    (pkgs.buildRustCrate ({
-      pname = name;
-      version = "1.0.0";
-      crateName = name;
-      dependencies = dependencies;
-      src = pkgs.runCommandLocal "write-lib.rs" {
-        src = src;
-        passAsFile = [ "src" ];
-      } ''
-        mkdir -p $out/src
-        cp "$srcPath" $out/src/lib.rs
-        find $out
-      '';
-    } // args));
-
-  /* Takes a `buildRustCrate` derivation as an input,
-    * builds it with `{ buildTests = true; }` and runs
-    * all tests found in its `tests` dir. If they are
-    * all successful, `$out` will point to the crate
-    * built with `{ buildTests = false; }`, otherwise
-    * it will fail to build.
-    *
-    * See also `nix.drvSeqL` which is used to implement
-    * this behavior.
-    */
-  testRustSimple = rustDrv:
-    let
-      crate = buildTests: rustDrv.override { inherit buildTests; };
-      tests = depot.nix.runExecline.local "${rustDrv.name}-tests-run" {} [
-        "importas" "out" "out"
-        "if" [
-          "pipeline" [ bins.s6-ls "${crate true}/tests" ]
-          "forstdin" "-o0" "test"
-          "importas" "test" "test"
-          "${crate true}/tests/$test"
-        ]
-        bins.s6-touch "$out"
-      ];
-    in drvSeqL [ tests ] (crate false);
 
 in {
   inherit
     python3
     python3Lib
-    rustSimple
-    rustSimpleBin
-    rustSimpleLib
     ;
 }
diff --git a/users/Profpatsch/writers/tests/default.nix b/users/Profpatsch/writers/tests/default.nix
index e61bf482ee..c4769a28c6 100644
--- a/users/Profpatsch/writers/tests/default.nix
+++ b/users/Profpatsch/writers/tests/default.nix
@@ -4,9 +4,6 @@ let
   inherit (depot.users.Profpatsch.writers)
     python3Lib
     python3
-    rustSimple
-    rustSimpleLib
-    rustSimpleBin
     ;
 
   inherit (pkgs)
@@ -44,54 +41,8 @@ let
     assert(test_lib.test() == "test 1 2 3")
   '');
 
-
-  rustTransitiveLib = rustSimpleLib {
-    name = "transitive";
-  } ''
-    pub fn transitive(s: &str) -> String {
-      let mut new = s.to_string();
-      new.push_str(" 1 2 3");
-      new
-    }
-
-    #[cfg(test)]
-    mod tests {
-      use super::*;
-
-      #[test]
-      fn test_transitive() {
-        assert_eq!(transitive("foo").as_str(), "foo 1 2 3")
-      }
-    }
-  '';
-
-  rustTestLib = rustSimpleLib {
-    name = "test_lib";
-    dependencies = [ rustTransitiveLib ];
-  } ''
-    extern crate transitive;
-    use transitive::{transitive};
-    pub fn test() -> String {
-      transitive("test")
-    }
-  '';
-
-  rustWithLib = run (rustSimple {
-    name = "rust-with-lib";
-    dependencies = [ rustTestLib ];
-  } ''
-    extern crate test_lib;
-
-    fn main() {
-      assert_eq!(test_lib::test(), String::from("test 1 2 3"));
-    }
-  '');
-
-
 in depot.nix.utils.drvTargets {
   inherit
     pythonWithLib
-    rustTransitiveLib
-    rustWithLib
     ;
 }
diff --git a/users/sterni/nint/default.nix b/users/sterni/nint/default.nix
index a7952393c6..5cf83d15d6 100644
--- a/users/sterni/nint/default.nix
+++ b/users/sterni/nint/default.nix
@@ -1,7 +1,7 @@
 { depot, pkgs, ... }:
 
 let
-  inherit (depot.users.Profpatsch.writers)
+  inherit (depot.nix.writers)
     rustSimpleBin
     ;
 in
diff --git a/users/sterni/nix/utf8/tests/default.nix b/users/sterni/nix/utf8/tests/default.nix
index 7569f8f071..ed38bd1241 100644
--- a/users/sterni/nix/utf8/tests/default.nix
+++ b/users/sterni/nix/utf8/tests/default.nix
@@ -14,7 +14,7 @@ let
     assertDoesNotThrow
     ;
 
-  inherit (depot.users.Profpatsch.writers)
+  inherit (depot.nix.writers)
     rustSimple
     ;