bootstrap/coco_proto_format.go

55 lines
1.3 KiB
Go

package bootstrap
import (
"bytes"
"github.com/emicklei/proto"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"gitter.top/common/protofmt"
"os"
)
func AddProtoFormat() *cobra.Command {
var protoFile string
cmd := &cobra.Command{
Use: "pbf",
Short: "protobuf format",
PreRun: func(_ *cobra.Command, args []string) {
if protoFile == "" && len(args) != 0 {
protoFile = args[0]
}
stat, err := os.Stat(protoFile)
if err != nil {
logrus.Fatalf("read proto file %s failed: %v", protoFile, err)
return
}
if stat.IsDir() {
logrus.Fatalf("proto file can not be directory")
return
}
},
Run: func(cmd *cobra.Command, args []string) {
file, err := os.Open(protoFile)
if err != nil {
logrus.Errorf("format proto file %s failed: %v", protoFile, err)
return
}
buf := new(bytes.Buffer)
parser := proto.NewParser(file)
parser.Filename(protoFile)
def, err := parser.Parse()
if err != nil {
logrus.Errorf("parse proto file %s failed: %v", protoFile, err)
return
}
protofmt.NewFormatter(buf, " ").Format(def)
if err := os.WriteFile(protoFile, buf.Bytes(), os.ModePerm); err != nil {
logrus.Errorf("write proto file %s failed: %v", protoFile, err)
return
}
},
}
cmd.Flags().StringVar(&protoFile, "path", "", "proto file path")
return cmd
}