about summary refs log tree commit diff
path: root/nix/buildTypedGo
diff options
context:
space:
mode:
Diffstat (limited to 'nix/buildTypedGo')
-rw-r--r--nix/buildTypedGo/default.nix33
-rw-r--r--nix/buildTypedGo/example/default.nix8
-rw-r--r--nix/buildTypedGo/example/main.go215
3 files changed, 56 insertions, 0 deletions
diff --git a/nix/buildTypedGo/default.nix b/nix/buildTypedGo/default.nix
new file mode 100644
index 000000000000..1c443484920f
--- /dev/null
+++ b/nix/buildTypedGo/default.nix
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: Apache-2.0
+#
+# A crude wrapper around //nix/buildGo that supports the Go 2 alpha.
+#
+# The way the alpha is implemented is via a transpiler from typed to
+# untyped Go.
+{ depot, pkgs, ... }:
+
+let
+  inherit (builtins)
+    stringLength
+    substring;
+
+  inherit (depot.nix.buildGo) gpackage program;
+
+  go2goext = file: substring 0 ((stringLength file) - 1) file;
+  go2go = file: pkgs.runCommandNoCC "${go2goext (toString file)}" {} ''
+    cp ${file} .
+    ${pkgs.go}/bin/go tool go2go translate *.go2
+    mv *.go $out
+  '';
+
+in rec {
+  program = { name, srcs, deps ? [], x_defs ? {} }: depot.nix.buildGo.program {
+    inherit name deps x_defs;
+    srcs = map go2go srcs;
+  };
+
+  package = { name, srcs, deps ? [], x_defs ? {}, sfiles ? [] }: depot.nix.buildGo.package {
+    inherit name deps x_defs sfiles;
+    srcs = map go2go srcs;
+  };
+}
diff --git a/nix/buildTypedGo/example/default.nix b/nix/buildTypedGo/example/default.nix
new file mode 100644
index 000000000000..5b6d4171f99c
--- /dev/null
+++ b/nix/buildTypedGo/example/default.nix
@@ -0,0 +1,8 @@
+{ depot, ... }:
+
+depot.nix.buildTypedGo.program {
+  name = "example";
+  srcs = [
+    ./main.go2
+  ];
+}
diff --git a/nix/buildTypedGo/example/main.go2 b/nix/buildTypedGo/example/main.go2
new file mode 100644
index 000000000000..8986f57b94c7
--- /dev/null
+++ b/nix/buildTypedGo/example/main.go2
@@ -0,0 +1,15 @@
+package main
+
+import (
+	"fmt"
+)
+
+func Print(type T)(s []T) {
+	for _, v := range s {
+		fmt.Print(v)
+	}
+}
+
+func main() {
+	Print([]string{"Hello, ", "TVL\n"})
+}