about summary refs log tree commit diff
path: root/users/Profpatsch/writers
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2021-01-02T13·54+0100
committerProfpatsch <mail@profpatsch.de>2021-01-03T16·29+0000
commit1261616bff04b6a5cb966778da8a336245c08979 (patch)
treec84718bf113e0ba06a92d243de84e694ab625f89 /users/Profpatsch/writers
parente219c133280dde03f2bf5e763b23e67ddeae83e0 (diff)
feat(Profpatsch/writers): add rustSimple writers r/2056
A bunch of writer functions wrapping the `buildRustCrate`
functionality of nixpkgs. Can be used to write inline rust code, or
rust code read from files with `builtins.readFile`.

Change-Id: I9d74e9381b858b485925e4dc3fbb7fc392877c0a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2318
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
Diffstat (limited to 'users/Profpatsch/writers')
-rw-r--r--users/Profpatsch/writers/default.nix58
-rw-r--r--users/Profpatsch/writers/tests.nix58
2 files changed, 107 insertions, 9 deletions
diff --git a/users/Profpatsch/writers/default.nix b/users/Profpatsch/writers/default.nix
index 9863f0fae0..4eb354c305 100644
--- a/users/Profpatsch/writers/default.nix
+++ b/users/Profpatsch/writers/default.nix
@@ -1,6 +1,6 @@
 { depot, pkgs, lib, ... }:
 let
-  bins = depot.nix.getBins pkgs.coreutils ["printf" "mkdir" "cat"];
+  bins = depot.nix.getBins pkgs.coreutils ["printf" "mkdir" "cat" "ln"];
 
   inherit (depot.nix.yants) defun struct restrict attrs list string drv any;
 
@@ -11,7 +11,9 @@ let
           [ "E" "W" ])
       string;
   Libraries = defun [ (attrs any) (list drv) ];
-  python3 = name: {
+
+  python3 = {
+    name,
     libraries ? (_: []),
     flakeIgnore ? []
   }: pkgs.writers.writePython3 name {
@@ -62,12 +64,61 @@ 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.ln "-sT" path "$out"
+  ];
+
+  rustSimpleBin = {
+    name,
+    dependencies ? [],
+    ...
+  }@args: src: 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 ? [],
+    ...
+  }@args: src: 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);
+
   tests = import ./tests.nix {
     inherit
       depot
       pkgs
       python3
       python3Lib
+      rustSimpleLib
+      rustSimple
       ;
    };
 
@@ -75,6 +126,9 @@ in {
   inherit
     python3
     python3Lib
+    rustSimple
+    rustSimpleBin
+    rustSimpleLib
     tests
     ;
 }
diff --git a/users/Profpatsch/writers/tests.nix b/users/Profpatsch/writers/tests.nix
index 13ddfd10e9..ce9c540162 100644
--- a/users/Profpatsch/writers/tests.nix
+++ b/users/Profpatsch/writers/tests.nix
@@ -1,31 +1,75 @@
-{ depot, pkgs, python3, python3Lib }:
+{ depot, pkgs, python3, python3Lib, rustSimpleLib, rustSimple }:
 
 let
-  transitiveLib = python3Lib {
+  run = drv: depot.nix.runExecline.local "run-${drv.name}" {} [
+    "if" [ drv ]
+    "importas" "out" "out"
+    "${pkgs.coreutils}/bin/touch" "$out"
+  ];
+
+  pythonTransitiveLib = python3Lib {
     name = "transitive";
   } ''
     def transitive(s):
       return s + " 1 2 3"
   '';
 
-  testLib = python3Lib {
+  pythonTestLib = python3Lib {
     name = "test_lib";
-    libraries = _: [ transitiveLib ];
+    libraries = _: [ pythonTransitiveLib ];
   } ''
     import transitive
     def test():
       return transitive.transitive("test")
   '';
 
-  pythonWithLib = python3 "python-with-lib" {
-    libraries = _: [ testLib ];
+  pythonWithLib = run (python3 {
+    name = "python-with-lib";
+    libraries = _: [ pythonTestLib ];
   } ''
     import test_lib
 
     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
+    }
   '';
 
+  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 {
   inherit
-    pythonWithLib;
+    pythonWithLib
+    rustTransitiveLib
+    rustWithLib
+    ;
 }