goimport for protobuf
This commit is contained in:
parent
e678606ea2
commit
cfedee740c
2
Makefile
2
Makefile
|
@ -55,7 +55,7 @@ install: test
|
||||||
GO111MODULE=off go install \
|
GO111MODULE=off go install \
|
||||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||||
|
|
||||||
auto:
|
proto:
|
||||||
# rm -f auto.pb.go
|
# rm -f auto.pb.go
|
||||||
autogenpb --proto file.proto --package main
|
autogenpb --proto file.proto --package main
|
||||||
# rm -f auto.sort.pb.go auto.newsort.pb.go # auto.marshal.pb.go
|
# rm -f auto.sort.pb.go auto.newsort.pb.go # auto.marshal.pb.go
|
||||||
|
|
|
@ -71,7 +71,6 @@ message Fruits { // `autogenpb:marshal` `autogenpb:mutex`
|
||||||
string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
|
string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
|
||||||
string version = 2; // `autogenpb:version:v0.0.1`
|
string version = 2; // `autogenpb:version:v0.0.1`
|
||||||
repeated Fruit Fruits = 3; // THIS MUST BE "Fruit" and then "Fruit" + "s"
|
repeated Fruit Fruits = 3; // THIS MUST BE "Fruit" and then "Fruit" + "s"
|
||||||
// you can add additional things here but the three lines above must conform to the standard above
|
int64 cost = 4; // you can add additional things here but the three lines above must conform to the standard above
|
||||||
int64 cost = 4;
|
|
||||||
map<string, string> junk = 5;
|
map<string, string> junk = 5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
// this file is called "fruit.proto"
|
||||||
|
//
|
||||||
|
// for autogenpb to work, you must have:
|
||||||
|
//
|
||||||
|
// "Fruit" must exist. you can put anything in it
|
||||||
|
//
|
||||||
|
// and
|
||||||
|
//
|
||||||
|
// "Fruits" MUST EXIST and start exactly this way
|
||||||
|
// It must be "Fruit" + 's' and must match the name of this file: "fruit.proto"
|
||||||
|
|
||||||
|
package main;
|
||||||
|
|
||||||
|
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
|
||||||
|
|
||||||
|
message Apple {
|
||||||
|
string name = 1; // `autogenpb:unique` // generates SortByxxx() and AppendUnique() functions
|
||||||
|
string genus = 2; // `autogenpb:unique` // generates same thing here but SortByGenus()
|
||||||
|
google.protobuf.Timestamp ctime = 3; // when the apple was born
|
||||||
|
}
|
||||||
|
|
||||||
|
message Apples {
|
||||||
|
string name = 1; // `autogenpb:unique` // generates SortByxxx() and AppendUnique() functions
|
||||||
|
string genus = 2; // `autogenpb:unique` // generates same thing here but SortByGenus()
|
||||||
|
repeated Apple apples = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Pear { // `autogenpb:nomutex`
|
||||||
|
string name = 1; // `autogenpb:sort`
|
||||||
|
string favorite = 2; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
}
|
||||||
|
|
||||||
|
message Pears { // `autogenpb:nomutex`
|
||||||
|
string name = 1; // `autogenpb:sort`
|
||||||
|
string favorite = 2; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
repeated Pear pears = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Banana { // `autogenpb:nomutex`
|
||||||
|
repeated string name = 1; // `autogenpb:sort`
|
||||||
|
string favorite = 2; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
string country = 3; // `autogenpb:sort`
|
||||||
|
}
|
||||||
|
|
||||||
|
message Basket { // `autogenpb:nomutex`
|
||||||
|
repeated string name = 1; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
string favorite = 2; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
int64 price = 3; // `autogenpb:sort`
|
||||||
|
repeated Banana banna = 4;
|
||||||
|
repeated Pear pears = 5;
|
||||||
|
repeated Apple stacks = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Fruit" must exist. you can put anything in it
|
||||||
|
message Fruit {
|
||||||
|
string brand = 1; // `autogenpb:unique` `autogenpb:sort`
|
||||||
|
Apple apples = 2;
|
||||||
|
repeated Pear pears = 3;
|
||||||
|
string UPC = 4; // `autogenpb:sort` `autogenpb:unique`
|
||||||
|
string city = 5; // `autogenpb:sort`
|
||||||
|
Pears notpears = 6;
|
||||||
|
Pears fakepears = 7;
|
||||||
|
repeated Basket gifts = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Fruits" MUST EXIST and start exactly this way
|
||||||
|
// It must be "Fruit" + 's' and must match the name of this file: "fruit.proto"
|
||||||
|
message Fruits { // `autogenpb:marshal` `autogenpb:mutex`
|
||||||
|
string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
|
||||||
|
string version = 2; // `autogenpb:version:v0.0.1`
|
||||||
|
repeated Fruit Fruits = 3; // THIS MUST BE "Fruit" and then "Fruit" + "s"
|
||||||
|
int64 cost = 4; // you can add additional things here but the three lines above must conform to the standard above
|
||||||
|
map<string, string> junk = 5;
|
||||||
|
}
|
||||||
|
|
1
main.go
1
main.go
|
@ -77,6 +77,7 @@ func main() {
|
||||||
log.Info("autogenpb parse error:", err)
|
log.Info("autogenpb parse error:", err)
|
||||||
badExit(err)
|
badExit(err)
|
||||||
}
|
}
|
||||||
|
protoReformat(argv.Proto)
|
||||||
|
|
||||||
if pf.Bases == nil {
|
if pf.Bases == nil {
|
||||||
badExit(fmt.Errorf("Base was nil. 'message %s {` did not exist", pf.Filebase))
|
badExit(fmt.Errorf("Base was nil. 'message %s {` did not exist", pf.Filebase))
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// like 'goimport' but for .proto files
|
||||||
|
|
||||||
|
var maxVarname int
|
||||||
|
var maxVartype int
|
||||||
|
|
||||||
|
func protoReformat(filename string) error {
|
||||||
|
// read in the .proto file
|
||||||
|
data, err := os.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Info("file read failed", filename, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pf, err := os.OpenFile(filename+".new", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
||||||
|
if err != nil {
|
||||||
|
log.Info("file open error. permissions?", filename, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer pf.Close()
|
||||||
|
|
||||||
|
var inMessage bool
|
||||||
|
var curmsg []string
|
||||||
|
|
||||||
|
// gets the max vartype and varname
|
||||||
|
for _, line := range strings.Split(string(data), "\n") {
|
||||||
|
if strings.HasPrefix(line, "message ") {
|
||||||
|
inMessage = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the end of the message
|
||||||
|
if strings.HasPrefix(line, "}") {
|
||||||
|
inMessage = false
|
||||||
|
formatMessage(curmsg)
|
||||||
|
curmsg = nil
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't format or change anything when not in a "message {" section
|
||||||
|
if !inMessage {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
curmsg = append(curmsg, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse the proto file for message struct names
|
||||||
|
for _, line := range strings.Split(string(data), "\n") {
|
||||||
|
if strings.HasPrefix(line, "message ") {
|
||||||
|
inMessage = true
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
if len(parts) > 3 {
|
||||||
|
start := parts[0] + " " + parts[1] + " " + parts[2]
|
||||||
|
end := strings.Join(parts[3:], " ")
|
||||||
|
offset := maxVarname + maxVartype + 16 - len(start)
|
||||||
|
pad := fmt.Sprintf("%d", offset)
|
||||||
|
hmm := "%s %" + pad + "s %s"
|
||||||
|
line = fmt.Sprintf(hmm, start, " ", end)
|
||||||
|
}
|
||||||
|
fmt.Fprintln(pf, line)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the end of the message
|
||||||
|
if strings.HasPrefix(line, "}") {
|
||||||
|
inMessage = false
|
||||||
|
for _, newline := range formatMessage(curmsg) {
|
||||||
|
fmt.Fprintln(pf, newline)
|
||||||
|
}
|
||||||
|
fmt.Fprintln(pf, line)
|
||||||
|
curmsg = nil
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't format or change anything when not in a "message {" section
|
||||||
|
if !inMessage {
|
||||||
|
fmt.Fprintln(pf, line)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
curmsg = append(curmsg, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
// for i, s := range slices.Backward(pf.ToSort) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatMessage(curmsg []string) []string {
|
||||||
|
var newmsg []string
|
||||||
|
|
||||||
|
// find the max length of varname and vartype
|
||||||
|
for _, line := range curmsg {
|
||||||
|
parts := strings.Split(line, ";")
|
||||||
|
if len(parts) < 2 {
|
||||||
|
log.Info("parse error", line)
|
||||||
|
return curmsg
|
||||||
|
}
|
||||||
|
|
||||||
|
vartype, varname, _, _ := tokenMsgVar(line)
|
||||||
|
if len(vartype) > maxVartype {
|
||||||
|
maxVartype = len(vartype)
|
||||||
|
}
|
||||||
|
if len(varname) > maxVarname {
|
||||||
|
maxVarname = len(varname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, line := range curmsg {
|
||||||
|
mt := fmt.Sprintf("%d", maxVartype)
|
||||||
|
mv := fmt.Sprintf("%d", maxVarname)
|
||||||
|
|
||||||
|
hmm := " %-" + mt + "s %-" + mv + "s = %-3s %s"
|
||||||
|
|
||||||
|
vartype, varname, id, end := tokenMsgVar(line)
|
||||||
|
end = strings.TrimSpace(end)
|
||||||
|
id = id + ";"
|
||||||
|
|
||||||
|
newline := fmt.Sprintf(hmm, vartype, varname, id, end)
|
||||||
|
newmsg = append(newmsg, newline)
|
||||||
|
}
|
||||||
|
return newmsg
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns vartype, varname, id, end
|
||||||
|
func tokenMsgVar(line string) (string, string, string, string) {
|
||||||
|
parts := strings.Split(line, ";")
|
||||||
|
front := parts[0]
|
||||||
|
end := strings.Join(parts[1:], ";")
|
||||||
|
|
||||||
|
var id string
|
||||||
|
var varname string
|
||||||
|
var vartype string
|
||||||
|
|
||||||
|
parts = strings.Fields(front)
|
||||||
|
parts, id = slicesPop(parts)
|
||||||
|
parts, _ = slicesPop(parts) // this is the "=" sign
|
||||||
|
parts, varname = slicesPop(parts)
|
||||||
|
vartype = strings.Join(parts, " ")
|
||||||
|
|
||||||
|
return vartype, varname, id, end
|
||||||
|
}
|
||||||
|
|
||||||
|
func slicesPop(parts []string) ([]string, string) {
|
||||||
|
if len(parts) == 0 {
|
||||||
|
return nil, ""
|
||||||
|
}
|
||||||
|
if len(parts) == 1 {
|
||||||
|
return nil, parts[0]
|
||||||
|
}
|
||||||
|
x := len(parts)
|
||||||
|
end := parts[x-1]
|
||||||
|
return parts[0 : x-1], end
|
||||||
|
}
|
Loading…
Reference in New Issue