From 99c036733bb581fa7bf70562dd25ae55e35461c7 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Wed, 8 Jan 2025 19:56:45 -0600 Subject: [PATCH] runs the testfiles/ test --- Makefile | 7 ++-- auto.proto | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 auto.proto diff --git a/Makefile b/Makefile index 89c133d..4ddec1f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = $(shell git describe --tags) BUILDTIME = $(shell date +%Y.%m.%d_%H%M) -test: goimports build auto +test: goimports build test full: clean goimports auto vet install @@ -27,7 +27,10 @@ auto.pb.go: auto.proto ./autogenpb --proto auto.proto --package testfiles rm -f auto.sort.pb.go auto.marshal.pb.go -auto: +test: + make -C testfiles full + +junk: cd testfiles; rm -f go.* *.pb.go cd testfiles; ../autogenpb --proto auto.proto --package yellow cd testfiles; GO111MODULE=off go vet diff --git a/auto.proto b/auto.proto new file mode 100644 index 0000000..7d5c0d0 --- /dev/null +++ b/auto.proto @@ -0,0 +1,101 @@ +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 ' +// 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; // `autogen:default:b2a2de35-07b6-443b-8188-709e27bee8a7` + string version = 2; // `autogen:default:2` + repeated Apple Apples = 3; // `autogen:sort` + repeated Pears More = 4; // `autogen:sort` + repeated string Color = 5; // `autogen:sort` `autogen:unique` +} + +message Pears { + 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 unique = 5; // if the fields should have AppendUnique() functions +} + +message File { // `autogen:nomarshal` + string Package = 1; // whatever the package name is at the top of the .go file + string filename = 2; // yellow.proto + string filebase = 3; // yellow + string uuid = 4; // the uuid to use in a func NewMsgName() + int64 version = 5; // the version to use in a func NewMsgName() + + // every struct in this proto file, this file has: "Apple", "Apples", ... "File", etc... + repeated MsgName msgNames = 6; // `autogen: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 { // `autogen:marshal` + string uuid = 1; // if you use this scheme, autogen will be able to identify your + int64 version = 2; // protobuf files from the command line. + 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 { // `autogen:marshal` + string uuid = 1; // + int64 version = 2; // +}