feat(nix/buildTypedGo): Add a //nix/buildGo wrapper for typed Go

These functions work like buildGo.program & buildGo.package, but run
the .go2 sources through go2go first before passing them to the
//nix/buildGo equivalents.

Change-Id: Id1ebab6085c390d6986387370181377b9f5d39e8
This commit is contained in:
Vincent Ambo 2020-06-18 02:29:52 +01:00
parent 22821b886b
commit e1e1764e32
3 changed files with 56 additions and 0 deletions

View file

@ -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;
};
}

View file

@ -0,0 +1,8 @@
{ depot, ... }:
depot.nix.buildTypedGo.program {
name = "example";
srcs = [
./main.go2
];
}

View file

@ -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"})
}