summaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
Diffstat (limited to 'example')
-rw-r--r--example/Makefile25
-rw-r--r--example/auto.proto107
-rw-r--r--example/fruit.New.go7
-rw-r--r--example/fruit.proto46
-rw-r--r--example/main.go21
5 files changed, 206 insertions, 0 deletions
diff --git a/example/Makefile b/example/Makefile
new file mode 100644
index 0000000..7558b5e
--- /dev/null
+++ b/example/Makefile
@@ -0,0 +1,25 @@
+VERSION = $(shell git describe --tags)
+BUILDTIME = $(shell date +%Y.%m.%d_%H%M)
+
+full: clean goimports auto vet build
+ ./testfiles
+
+vet:
+ @GO111MODULE=off go vet
+ @echo this go binary package should build okay
+
+build:
+ rm -f fruit.newsort.pb.go
+ GO111MODULE=off go build
+ ./testfiles
+
+auto:
+ ../autogenpb --proto fruit.proto --package main
+
+goimports:
+ goimports -w *.go
+
+clean:
+ -rm -f go.*
+ -rm -f *.pb.go
+ -rm -f testfiles
diff --git a/example/auto.proto b/example/auto.proto
new file mode 100644
index 0000000..d65ccd0
--- /dev/null
+++ b/example/auto.proto
@@ -0,0 +1,107 @@
+syntax = "proto3";
+
+// here are some docs, but probably it's just easier to run
+// autogenpb on this file and see what gets autogenerated
+// in this directory. All autogenerated files are named *.pb.go
+
+// the 'uuid' standard at the end is an experiment
+// establish a way to identify arbitrary .pb files
+
+// You can generate Marshal & Unmarshal for any struct (message) you want
+// You can generate SortBy and Append functions ONLY FOR 'repeated <message>'
+// Also, those structs must be defined in the same file
+// Additionally, you must use `autogenpb:mutex` on the parent struct.
+// The autogenerated code requires a RW mutex and autogenpb will insert it into the struct
+
+package main;
+
+message Apple { // `autogenpb:marshal`
+ string name = 1; // `autogenpb:unique` // generates SortByxxx() and AppendUnique() functions
+ string genus = 2; // `autogenpb:unique` // generates same thing here but SortByGenus()
+}
+
+message Apples { // `autogenpb:marshal` `autogenpb:mutex`
+ string uuid = 1; // `autogenpb:default:b2a2de35-07b6-443b-8188-709e27bee8a7`
+ string version = 2; // `autogenpb:default:2`
+ repeated Apple apples = 3; // `autogenpb:sort` `autogenpb:unique`
+ repeated Pear pears = 4; // `autogenpb:sort` `autogenpb:unique`
+ repeated Pear more = 5; // `autogenpb:sort` `autogenpb:unique` // not supported. 'More' can only be the string 'Pears'
+ repeated string color = 6; // `autogenpb:sort` `autogenpb:unique`
+}
+
+message Pear {
+ string name = 1; //
+ string favorite = 2; // `autogenpb:sort`
+}
+
+// above is an example
+
+//
+// below are the actual structs autogen uses
+// autogen parses the .proto file and then store the information
+// it needs in these protobuf files, then it processes the
+// protobuf files to write out *.sort.pb.go and *.marshal.pb.go files
+//
+message MsgName {
+ // If you have:
+ //
+ // "Shelf" for msgname
+ // "Books" for name
+ //
+ // Then in the proto file, that would mean it would look like:
+ //
+ // message Shelf {
+ // and then
+ // repeated string Books = 42;
+ //
+ // autogenpb will then generate sort functions for each 'name'
+ // things like:
+ //
+ // for _, b := range all.Book {
+ //
+ // and sort functions like:
+ //
+ // func (a ShelfBook) Less(i, j int) bool { return a[i].Book < a[j].Book }
+ //
+
+ string name = 1; // the name of the message aka struct. for this example: "Shelf"
+ bool marshal = 2; // if "Shelf" should have Marshal & Unmarshal functions
+ bool mutex = 3; // an experiment to insert a mutex into the protoc generated msg struct (bad idea?)
+ repeated string sort = 4; // "Book", "Picture", etc
+ repeated string aq = 5; // if the fields should have AppendUnique() functions
+ repeated string uniq = 6; // the non-repeating fields that should be unique
+}
+
+message Unique {
+ string name = 1; // the variable name of the repeatable struct that must be unique
+ string msgName = 2; // the struct that is repeated
+ repeated string keys = 3; // the variables in that structure to check are unique
+}
+
+message File { // `autogenpb:nomarshal`
+ string name = 1; // for this one: autogen.proto
+ string uuid = 2; // the uuid to use in a func NewMsgName()
+ int64 version = 3; // the version to use in a func NewMsgName()
+
+ // in this proto file, this would have "Apple", "Apples", ... "File", etc...
+ repeated MsgName msgNames = 4; // `autogenpb:unique` // in this file
+}
+
+// I know, I know, the whole point of using protobuf
+// is so you don't need a uuid or versions because it's
+// inherently forward compatable. nonetheless, a simple stubbed out
+// trivial and empty protobuf message can marshal and identify all the files
+// also, this could be used to modify /usr/bin/file /usr/share/magic to identify the files
+// maybe this is already been done and is pointless, but it seems like a good idea
+message Files { // `autogenpb:marshal`
+ string uuid = 1; // `autogenpb:uuid:fakeuuid`
+ string version = 2; // `autogenpb:id:42`
+ repeated File Files = 3; // an array of each .proto file in the working directory
+}
+
+// this generic message is used by autogen to identify and
+// then dump the uuid and version from any arbitrary .pb file
+message Identify { // `autogenpb:marshal`
+ string uuid = 1; //
+ int64 version = 2; //
+}
diff --git a/example/fruit.New.go b/example/fruit.New.go
new file mode 100644
index 0000000..c00f981
--- /dev/null
+++ b/example/fruit.New.go
@@ -0,0 +1,7 @@
+package main
+
+func NewFruits() *Fruits {
+ x := new(Fruits)
+ x.Uuid = "test"
+ return x
+}
diff --git a/example/fruit.proto b/example/fruit.proto
new file mode 100644
index 0000000..821ae6c
--- /dev/null
+++ b/example/fruit.proto
@@ -0,0 +1,46 @@
+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 fruit;
+
+import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
+
+message Apple { // `autogenpb:marshal`
+ 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 Pear {
+ string name = 1; //
+ string favorite = 2; // `autogenpb:sort`
+}
+
+// "Fruit" must exist. you can put anything in it
+message Fruit { // `autogenpb:marshal`
+ string brand = 1; // `autogenpb:unique`
+ repeated Apple apples = 2;
+ repeated Pear pears = 3;
+ string UPC = 4; // `autogenpb:sort` `autogenpb:unique`
+ string city = 5; // `autogenpb:sort`
+}
+
+// "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"
+ // you can add additional things here but the three lines above must conform to the standard above
+ int64 cost = 4;
+}
diff --git a/example/main.go b/example/main.go
new file mode 100644
index 0000000..47dad4f
--- /dev/null
+++ b/example/main.go
@@ -0,0 +1,21 @@
+//go:build go1.20
+// +build go1.20
+
+package main
+
+import "go.wit.com/log"
+
+// sent via -ldflags
+var VERSION string
+var BUILDTIME string
+
+var sortmap map[string]string
+var marshalKeys []string
+var uniqueKeys []string
+
+var pb *Fruits
+
+func main() {
+ pb = NewFruits()
+ log.Info("did nothing yet", pb)
+}