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" ) func InstallZapMarshaler(ctx context.Context) error { alreadyDone, err := build.HasExecutableInBuildtools("protoc-gen-zap-marshaler") if err != nil { return err } if alreadyDone { return nil } return build.InstallGoExecutable(ctx, "github.com/kazegusuri/go-proto-zap-marshaler/protoc-gen-zap-marshaler@latest") } func InstallGoProtoc(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 InstallProtoDeps(ctx context.Context) { mg.CtxDeps(ctx, InstallZapMarshaler, InstallGoProtoc) } type Protobuf mg.Namespace func (Protobuf) BuildProtocolBuffers(ctx context.Context) error { mg.CtxDeps(ctx, InstallProtoDeps) tooldir, err := build.GetBuildToolsDir() if err != nil { return err } pluginPathFlag := fmt.Sprintf("--plugin=%s", path.Join(tooldir, "protoc-gen-go")) cmd := exec.CommandContext(ctx, "protoc", pluginPathFlag, "-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 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 }) }