package server import ( "context" "fmt" "git.reya.zone/reya/hexmap/build" "github.com/magefile/mage/mg" "io/fs" "os" "os/exec" "path" "path/filepath" "strings" ) // TODO: GoGet // TODO: Build // TODO: Clean type Protobuf mg.Namespace func (Protobuf) InstallGoPlugin(ctx context.Context) error { alreadyDone, err := build.HasExecutableInBuildtools("protoc-gen-go") if err != nil { return err } if alreadyDone { return nil } return build.InstallGoExecutable(ctx, "google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1") } func (Protobuf) InstallPlugins(ctx context.Context) { mg.CtxDeps(ctx, Protobuf.InstallGoPlugin) } func (Protobuf) Build(ctx context.Context) error { mg.CtxDeps(ctx, Protobuf.Clean, Protobuf.InstallPlugins) tooldir, err := build.GetBuildToolsDir() if err != nil { return err } goPluginPathFlag := fmt.Sprintf("--plugin=%s", path.Join(tooldir, "protoc-gen-go")) cmd := exec.CommandContext(ctx, "protoc", goPluginPathFlag, "-I=proto", "--go_out=.", "--go_opt=module=git.reya.zone/reya/hexmap", "proto/action.proto", "proto/client.proto", "proto/coords.proto", "proto/map.proto", "proto/server.proto", "proto/user.proto") cmd.Stderr = os.Stderr if mg.Verbose() { cmd.Stdout = os.Stdout } return cmd.Run() } func (Protobuf) Clean(ctx context.Context) error { return filepath.WalkDir("server", func(path string, d fs.DirEntry, dirErr error) error { if ctx.Err() != nil { return ctx.Err() } if dirErr != nil { return dirErr } if strings.HasSuffix(path, ".pb.go") && !d.IsDir() { if mg.Verbose() { fmt.Printf("Removing generated protobuf code at %s\n", path) } err := os.Remove(path) if err != nil { return err } } return nil }) }