diff --git a/cmd/protoc-gen-ddd/go.mod b/cmd/protoc-gen-ddd/go.mod new file mode 100644 index 0000000..f5b504d --- /dev/null +++ b/cmd/protoc-gen-ddd/go.mod @@ -0,0 +1,8 @@ +module github.com/xoe-labs/ddd-gen/cmd/protoc-gen-ddd + +go 1.15 + +require ( + github.com/dave/jennifer v1.4.1 + google.golang.org/protobuf v1.25.0 +) diff --git a/cmd/protoc-gen-ddd/go.sum b/cmd/protoc-gen-ddd/go.sum new file mode 100644 index 0000000..6801509 --- /dev/null +++ b/cmd/protoc-gen-ddd/go.sum @@ -0,0 +1,66 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/dave/jennifer v1.4.1 h1:XyqG6cn5RQsTj3qlWQTKlRGAyrTcsk1kUmWdZBzRjDw= +github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/cmd/protoc-gen-ddd/main.go b/cmd/protoc-gen-ddd/main.go new file mode 100644 index 0000000..d806722 --- /dev/null +++ b/cmd/protoc-gen-ddd/main.go @@ -0,0 +1,202 @@ +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "flag" + "os" + "unicode" + + "google.golang.org/protobuf/compiler/protogen" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/pluginpb" + + "github.com/dave/jennifer/jen" + // "github.com/xoe-labs/ddd-gen/pkg/gen_domain/generator" +) + +// fieldGoType returns the Go type used for a field. +// +// If it returns pointer=true, the struct field is a pointer to the type. +func fieldGoType(g *protogen.GeneratedFile, field *protogen.Field) (goType string, pointer bool) { + if field.Desc.IsWeak() { + return "struct{}", false + } + + pointer = field.Desc.HasPresence() + switch field.Desc.Kind() { + case protoreflect.BoolKind: + goType = "bool" + case protoreflect.EnumKind: + goType = g.QualifiedGoIdent(field.Enum.GoIdent) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + goType = "int32" + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + goType = "uint32" + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + goType = "int64" + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + goType = "uint64" + case protoreflect.FloatKind: + goType = "float32" + case protoreflect.DoubleKind: + goType = "float64" + case protoreflect.StringKind: + goType = "string" + case protoreflect.BytesKind: + goType = "[]byte" + pointer = false // rely on nullability of slices for presence + case protoreflect.MessageKind, protoreflect.GroupKind: + goType = "*" + g.QualifiedGoIdent(field.Message.GoIdent) + pointer = false // pointer captured as part of the type + } + switch { + case field.Desc.IsList(): + return "[]" + goType, false + case field.Desc.IsMap(): + keyType, _ := fieldGoType(g, field.Message.Fields[0]) + valType, _ := fieldGoType(g, field.Message.Fields[1]) + return fmt.Sprintf("map[%v]%v", keyType, valType), false + } + return goType, pointer +} + +func main() { + // Protoc passes pluginpb.CodeGeneratorRequest in via stdin + // marshalled with Protobuf + input, _ := ioutil.ReadAll(os.Stdin) + var req pluginpb.CodeGeneratorRequest + proto.Unmarshal(input, &req) + + var flags flag.FlagSet + Entity := flags.String("entity", "", "") + opts := &protogen.Options{ + ParamFunc: flags.Set, + } + if Entity == nil { + panic("necessary to define 'entity' option (eg. --ddd_out=entity=Account:.)") + } + plugin, err := opts.New(&req) + if err != nil { + panic(err) + } + + // Protoc passes a slice of File structs for us to process + for _, file := range plugin.Files { + if !file.Generate { + continue + } + + // Specify the output filename + filename := file.GeneratedFilenamePrefix + ".model.go" + genFile := plugin.NewGeneratedFile(filename, file.GoImportPath) + + // 1. Initialise a buffer to hold the generated code + buf := &bytes.Buffer{} + + // 2. Write the package name + f := jen.NewFilePathName(string(file.GoImportPath), string(file.GoPackageName)) + + var visited = make(map[string]bool) + + f.Commentf("%s is a domain model", *Entity) + f.Type().Id(*Entity).StructFunc(func(g *jen.Group) { + for _, msg := range file.Messages { + for _, fld := range msg.Fields { + if _, ok := visited[fld.GoName]; !ok { + goType, pointer := fieldGoType(genFile, fld) + if pointer { + g.Id(lowerFirst(fld.GoName)).Op("*").Id(goType) + } else { + g.Id(lowerFirst(fld.GoName)).Id(goType) + } + visited[fld.GoName] = true + } + } + } + }) + + var New = "New" + + f.Commentf("%s%s constructs an empty %s", New, *Entity, *Entity) + f.Func().Id(New + *Entity).Params().Op("*").Id(*Entity).Block( + jen.Return().Op("&").Id(*Entity).Values(), + ) + + // var String = "String" + + // f.Commentf("%s implements fmt.Stringer for %s", String, Entity) + // f.Func().Id(String).Params().String().Block( + // jen.Return().Lit(""), + // ) + + var Apply = "Apply" + + f.Commentf("%s implements app.??? for %s", Apply, *Entity) + f.Func().Params( + jen.Id(firstLower(*Entity)).Op("*").Id(*Entity), + ).Id(Apply).Params( + jen.Id("fact").Interface(), + ).Params( + jen.Id("success").Bool(), + ).Block( + jen.Switch( + jen.Id("f").Op(":=").Id("fact").Assert(jen.Type()), + ).BlockFunc(func(g *jen.Group) { + for _, msg := range file.Messages { + g.Case( + jen.Op("*").Id(msg.GoIdent.GoName), + ).BlockFunc(func(g *jen.Group) { + for _, fld := range msg.Fields { + g.Id( + firstLower(*Entity), + ).Dot( + lowerFirst(fld.GoName), + ).Op("=").Id("f").Dot( + fld.GoName, + ) + } + g.Return().True() + }) + } + g.Default().Block( + jen.Return().False(), + ) + }), + ) + + err := f.Render(buf) + if err != nil { + panic(err) + } + + // 5. Pass the data from our buffer to the plugin file struct + _, err = genFile.Write(buf.Bytes()) + if err != nil { + panic(err) + } + } + + // Generate a response from our plugin and marshall as protobuf + stdout := plugin.Response() + out, err := proto.Marshal(stdout) + if err != nil { + panic(err) + } + + // Write the response to stdout, to be picked up by protoc + fmt.Fprintf(os.Stdout, string(out)) +} + +func lowerFirst(str string) string { + for i, v := range str { + return string(unicode.ToLower(v)) + str[i+1:] + } + return "" +} + +func firstLower(str string) string { + return "r" +} diff --git a/go.mod b/go.mod index a0feb93..db30e0c 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,13 @@ go 1.14 require ( github.com/dave/jennifer v1.4.1 + github.com/gogo/protobuf v1.3.1 + github.com/golang/protobuf v1.4.1 github.com/hashicorp/errwrap v1.0.0 github.com/mitchellh/go-homedir v1.1.0 github.com/satori/go.uuid v1.2.0 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.1 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc + google.golang.org/protobuf v1.25.0 ) diff --git a/go.sum b/go.sum index 960732e..0e9e9cf 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -39,6 +40,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -49,7 +52,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -58,10 +64,20 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -105,6 +121,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -145,6 +162,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -262,6 +280,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -270,6 +289,7 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -279,6 +299,7 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -297,9 +318,21 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -316,5 +349,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/test-svc/app/actor.proto b/internal/test-svc/app/actor.proto new file mode 100644 index 0000000..4369f1d --- /dev/null +++ b/internal/test-svc/app/actor.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package app; + +option go_package = "github.com/xoe-labs/ddd-gen/internal/test-svc/app/authorizable"; + + +message Actor { + string user = 1; + string elevation_token = 2; +} diff --git a/internal/test-svc/app/authorizable.go b/internal/test-svc/app/authorizable.go index 3d48c5a..1818741 100644 --- a/internal/test-svc/app/authorizable.go +++ b/internal/test-svc/app/authorizable.go @@ -6,6 +6,6 @@ package app type OffersAuthorizable interface { // TODO: adapt to your needs - User() string - ElevationToken() string + GetUser() string + GetElevationToken() string } diff --git a/internal/test-svc/app/authorizable/actor.go b/internal/test-svc/app/authorizable/actor.go deleted file mode 100644 index 7c2ec81..0000000 --- a/internal/test-svc/app/authorizable/actor.go +++ /dev/null @@ -1,15 +0,0 @@ -package authorizable - -// Actor represents a target entity --- this message component probably should be autogenerated, eg. by protobuf -type Actor struct { - user string - elevationToken string -} - -func (a *Actor) User() string { - return a.user -} - -func (a *Actor) ElevationToken() string { - return a.elevationToken -} diff --git a/internal/test-svc/app/authorizable/actor.pb.go b/internal/test-svc/app/authorizable/actor.pb.go new file mode 100644 index 0000000..626e2f2 --- /dev/null +++ b/internal/test-svc/app/authorizable/actor.pb.go @@ -0,0 +1,160 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: actor.proto + +package authorizable + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type Actor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + ElevationToken string `protobuf:"bytes,2,opt,name=elevation_token,json=elevationToken,proto3" json:"elevation_token,omitempty"` +} + +func (x *Actor) Reset() { + *x = Actor{} + if protoimpl.UnsafeEnabled { + mi := &file_actor_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Actor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Actor) ProtoMessage() {} + +func (x *Actor) ProtoReflect() protoreflect.Message { + mi := &file_actor_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Actor.ProtoReflect.Descriptor instead. +func (*Actor) Descriptor() ([]byte, []int) { + return file_actor_proto_rawDescGZIP(), []int{0} +} + +func (x *Actor) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *Actor) GetElevationToken() string { + if x != nil { + return x.ElevationToken + } + return "" +} + +var File_actor_proto protoreflect.FileDescriptor + +var file_actor_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, + 0x70, 0x70, 0x22, 0x44, 0x0a, 0x05, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x6f, 0x65, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x64, 0x64, 0x64, 0x2d, 0x67, 0x65, 0x6e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x73, 0x76, 0x63, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_actor_proto_rawDescOnce sync.Once + file_actor_proto_rawDescData = file_actor_proto_rawDesc +) + +func file_actor_proto_rawDescGZIP() []byte { + file_actor_proto_rawDescOnce.Do(func() { + file_actor_proto_rawDescData = protoimpl.X.CompressGZIP(file_actor_proto_rawDescData) + }) + return file_actor_proto_rawDescData +} + +var file_actor_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_actor_proto_goTypes = []interface{}{ + (*Actor)(nil), // 0: app.Actor +} +var file_actor_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_actor_proto_init() } +func file_actor_proto_init() { + if File_actor_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_actor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Actor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_actor_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_actor_proto_goTypes, + DependencyIndexes: file_actor_proto_depIdxs, + MessageInfos: file_actor_proto_msgTypes, + }.Build() + File_actor_proto = out.File + file_actor_proto_rawDesc = nil + file_actor_proto_goTypes = nil + file_actor_proto_depIdxs = nil +} diff --git a/internal/test-svc/app/distinguishable/target.go b/internal/test-svc/app/distinguishable/target.go index 033b297..f3ac080 100644 --- a/internal/test-svc/app/distinguishable/target.go +++ b/internal/test-svc/app/distinguishable/target.go @@ -7,16 +7,16 @@ import ( ) // Target represents a target entity --- this message component probably should be autogenerated, eg. by protobuf -type Target struct { - Continent string - Zone string - Office string - Id uuid.UUID -} +// type Target struct { +// Continent string +// Zone string +// Office string +// Id uuid.UUID +// } // Identifier implements the Distinguishable interface func (t *Target) Identifier() string { - return fmt.Sprintf("%s-%s-%s-%s", t.Continent, t.Zone, t.Office, t.Id) + return fmt.Sprintf("%s-%s-%s-%s", t.GetContinent(), t.GetZone(), t.GetOffice(), t.GetId()) } // IsDistinguishable implements the DistinguishableAsserter interface used by the @@ -25,6 +25,6 @@ func (t *Target) IsDistinguishable() bool { // in this example: // - continent and zone are not required for a target to be distinguishable // - for example, it might be used optionally for sharding or routing purposes - return t.Office != "" && t.Id != uuid.Nil + return t.GetOffice() != "" && t.GetId() != uuid.Nil } diff --git a/internal/test-svc/app/distinguishable/target.pb.go b/internal/test-svc/app/distinguishable/target.pb.go new file mode 100644 index 0000000..e49324f --- /dev/null +++ b/internal/test-svc/app/distinguishable/target.pb.go @@ -0,0 +1,178 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: target.proto + +package distinguishable + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type Target struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // UUID + Office string `protobuf:"bytes,2,opt,name=office,proto3" json:"office,omitempty"` + Zone string `protobuf:"bytes,3,opt,name=zone,proto3" json:"zone,omitempty"` + Continent string `protobuf:"bytes,4,opt,name=continent,proto3" json:"continent,omitempty"` +} + +func (x *Target) Reset() { + *x = Target{} + if protoimpl.UnsafeEnabled { + mi := &file_target_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Target) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Target) ProtoMessage() {} + +func (x *Target) ProtoReflect() protoreflect.Message { + mi := &file_target_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Target.ProtoReflect.Descriptor instead. +func (*Target) Descriptor() ([]byte, []int) { + return file_target_proto_rawDescGZIP(), []int{0} +} + +func (x *Target) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Target) GetOffice() string { + if x != nil { + return x.Office + } + return "" +} + +func (x *Target) GetZone() string { + if x != nil { + return x.Zone + } + return "" +} + +func (x *Target) GetContinent() string { + if x != nil { + return x.Continent + } + return "" +} + +var File_target_proto protoreflect.FileDescriptor + +var file_target_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, + 0x61, 0x70, 0x70, 0x22, 0x62, 0x0a, 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x6f, 0x65, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, + 0x64, 0x64, 0x2d, 0x67, 0x65, 0x6e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, + 0x74, 0x65, 0x73, 0x74, 0x2d, 0x73, 0x76, 0x63, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_target_proto_rawDescOnce sync.Once + file_target_proto_rawDescData = file_target_proto_rawDesc +) + +func file_target_proto_rawDescGZIP() []byte { + file_target_proto_rawDescOnce.Do(func() { + file_target_proto_rawDescData = protoimpl.X.CompressGZIP(file_target_proto_rawDescData) + }) + return file_target_proto_rawDescData +} + +var file_target_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_target_proto_goTypes = []interface{}{ + (*Target)(nil), // 0: app.Target +} +var file_target_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_target_proto_init() } +func file_target_proto_init() { + if File_target_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_target_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Target); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_target_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_target_proto_goTypes, + DependencyIndexes: file_target_proto_depIdxs, + MessageInfos: file_target_proto_msgTypes, + }.Build() + File_target_proto = out.File + file_target_proto_rawDesc = nil + file_target_proto_goTypes = nil + file_target_proto_depIdxs = nil +} diff --git a/internal/test-svc/app/target.proto b/internal/test-svc/app/target.proto new file mode 100644 index 0000000..a69711b --- /dev/null +++ b/internal/test-svc/app/target.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package app; + +option go_package = "github.com/xoe-labs/ddd-gen/internal/test-svc/app/distinguishable"; + + +message Target { + string id = 1; // UUID + string office = 2; + string zone = 3; + string continent = 4; +} diff --git a/internal/test-svc/domain/Account/account.go b/internal/test-svc/domain/Account/account.go deleted file mode 100644 index 3b6c0c8..0000000 --- a/internal/test-svc/domain/Account/account.go +++ /dev/null @@ -1,30 +0,0 @@ -package account - -import ( - "github.com/xoe-labs/ddd-gen/internal/test-svc/app/distinguishable" - "github.com/xoe-labs/ddd-gen/internal/test-svc/domain/holder" -) - -//go:generate go run ../../../../main.go --config ../../ddd-config.yaml domain entity -t Account -type Account struct { - holder holder.Holder `entity:"required,field holder is empty;getter"` - altHolders map[distinguishable.Target]holder.Holder `entity:"required,field alternative holders is empty;setter"` - holderRoles map[holder.Holder]string `entity:"required,field holder role map is empty"` - address string - balance int64 `entity:"private"` // read via domain logic: don't generate default getter - movements []int64 `entity:"private"` - blocked bool `entity:"private"` - blockReason bool `entity:"private"` - unblockReason bool `entity:"private"` - archived bool `entity:"private"` - archivedReason bool `entity:"private"` - validHolder bool `entity:"private"` - validatedBy string `entity:"private"` -} - -// Apply applies facts to Account -// implements application layer's entity interface. -func (a *Account) Apply(fact interface{}) { - // TODO: ipmlement -} - diff --git a/internal/test-svc/domain/Account/account_gen.go b/internal/test-svc/domain/Account/account_gen.go deleted file mode 100644 index 16e8d29..0000000 --- a/internal/test-svc/domain/Account/account_gen.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated by 'ddd-gen domain entity', DO NOT EDIT. -package account - -import ( - "errors" - "fmt" - distinguishable "github.com/xoe-labs/ddd-gen/internal/test-svc/app/distinguishable" - holder "github.com/xoe-labs/ddd-gen/internal/test-svc/domain/holder" - "reflect" -) - -// Constructors ... - -// New returns a guaranteed-to-be-valid Account or an error -func New(holder holder.Holder, altHolders map[distinguishable.Target]holder.Holder, holderRoles map[holder.Holder]string, address string) (*Account, error) { - if reflect.ValueOf(holder).IsZero() { - return nil, errors.New("field holder is empty") - } - if reflect.ValueOf(altHolders).IsZero() { - return nil, errors.New("field alternative holders is empty") - } - if reflect.ValueOf(holderRoles).IsZero() { - return nil, errors.New("field holder role map is empty") - } - a := &Account{ - address: address, - altHolders: altHolders, - holder: holder, - holderRoles: holderRoles, - } - return a, nil -} - -// MustNew returns a guaranteed-to-be-valid Account or panics -func MustNew(holder holder.Holder, altHolders map[distinguishable.Target]holder.Holder, holderRoles map[holder.Holder]string, address string) *Account { - a, err := New(holder, altHolders, holderRoles, address) - if err != nil { - panic(err) - } - return a -} - -// Marshalers ... - -// UnmarshalFromStore unmarshals Account from the repository so that non-constructable -// private fields can still be initialized from (private) repository state -// -// Important: DO NEVER USE THIS METHOD EXCEPT FROM THE REPOSITORY -// Reason: This method initializes private state, so you could corrupt the domain. -func UnmarshalFromStore(holder holder.Holder, altHolders map[distinguishable.Target]holder.Holder, holderRoles map[holder.Holder]string, address string, balance int64, movements []int64, blocked bool, blockReason bool, unblockReason bool, archived bool, archivedReason bool, validHolder bool, validatedBy string) *Account { - a := MustNew(holder, altHolders, holderRoles, address) - a.balance = balance - a.movements = movements - a.blocked = blocked - a.blockReason = blockReason - a.unblockReason = unblockReason - a.archived = archived - a.archivedReason = archivedReason - a.validHolder = validHolder - a.validatedBy = validatedBy - return a -} - -// Accessors ... - -// Holder returns holder value -func (a *Account) Holder() holder.Holder { - return a.holder -} - -// SetAltHolders sets altHolders value -func (a *Account) SetAltHolders(altHolders map[distinguishable.Target]holder.Holder) { - a.altHolders = altHolders -} - -// Utilities ... - -// Equal answers whether v is equivalent to a -// Always returns false if v is not a Account -func (a Account) Equal(v interface{}) bool { - other, ok := v.(Account) - if !ok { - return false - } - return true -} - -// String implements the fmt.Stringer interface and returns the native format of Account -func (a Account) String() string { - return fmt.Sprintf("") -} diff --git a/internal/test-svc/domain/Justfile b/internal/test-svc/domain/Justfile new file mode 100644 index 0000000..4285e7f --- /dev/null +++ b/internal/test-svc/domain/Justfile @@ -0,0 +1,23 @@ +gen: gen-facts gen-commands + +gen-facts: gen-facts-account gen-facts-holder + +gen-facts-account: + protoc \ + account.facts.proto \ + --go_out=. --ddd_out=entity=Account:. \ + --ddd_opt=paths=source_relative \ + --go_opt=paths=source_relative + +gen-facts-holder: + protoc \ + holder.facts.proto \ + --go_out=. --ddd_out=entity=Holder:. \ + --ddd_opt=paths=source_relative \ + --go_opt=paths=source_relative + +gen-commands: + protoc \ + commands.proto \ + --go_out=. \ + --go_opt=paths=source_relative diff --git a/internal/test-svc/domain/account.facts.proto b/internal/test-svc/domain/account.facts.proto new file mode 100644 index 0000000..d0ff082 --- /dev/null +++ b/internal/test-svc/domain/account.facts.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; +package domain.facts; + +option go_package = "github.com/xoe-labs/ddd-gen/internal/test-svc/domain"; + +import "holder.facts.proto"; + +message NewAccountMade { + HolderCreated holder = 1; + map alt_holders = 2; + map holder_roles = 3; + string address = 4; +} + +message NewAccountQuickMade { + HolderCreated holder = 1; + string address = 4; +} + +message AccountArchived { + string archive_reason = 1; + bool archived = 2; +} + +message AccountBlocked { + string block_reason = 1; + string unblock_reason = 2; + bool blocked = 3; +} + +message AccountHolderValidated { + string validated_by = 1; + bool validated = 2; +} + +message BalanceModified { + repeated int64 movements = 1; + int64 balance = 2; +} + diff --git a/internal/test-svc/domain/commands.proto b/internal/test-svc/domain/commands.proto new file mode 100644 index 0000000..b4919f6 --- /dev/null +++ b/internal/test-svc/domain/commands.proto @@ -0,0 +1,67 @@ +syntax = "proto3"; +package domain.commands; + +option go_package = "github.com/xoe-labs/ddd-gen/internal/test-svc/domain"; + +import "google/protobuf/timestamp.proto"; + +message CreateHolder { + enum HolderType { + LOCAL = 0; + REMOTE = 1; + } + string name = 1; + string altname = 2; + HolderType h_typ = 3; + google.protobuf.Timestamp bday = 16; +} + +// MakeNewAccount creates a new account +// Business Logic Wrap-Up: +// ... +message MakeNewAccount { + CreateHolder holder = 1; + map alt_holders = 2; + map holder_roles = 3; + string address = 4; +} + +// MakeNewAccountQuick creates a new account without holder roles or alt holders +// Business Logic Wrap-Up: +// ... +message MakeNewAccountQuick { + CreateHolder holder = 1; + string address = 4; +} + +// ArchiveAccount archives an account +// Business Logic Wrap-Up: +// ... +message ArchiveAccount { + string archive_reason = 1; +} + +// BlockAccount blocks an account +// Business Logic Wrap-Up: +// ... +message BlockAccount { + string block_reason = 1; +} + +// ValidateAccountHolder validates an account holder +// Business Logic Wrap-Up: +// ... +message ValidateAccountHolder { + string validated_by = 1; +} + +// ModifyBalance modifies the account balance +// Business Logic Wrap-Up: +// ... +message ModifyBalance { + repeated int64 movements = 1; +} + +message ModifyBalanceFromSvc { +} + diff --git a/internal/test-svc/domain/doc.go b/internal/test-svc/domain/doc.go new file mode 100644 index 0000000..39952dd --- /dev/null +++ b/internal/test-svc/domain/doc.go @@ -0,0 +1,3 @@ +//go:generate just gen + +package domain diff --git a/internal/test-svc/domain/holder.facts.proto b/internal/test-svc/domain/holder.facts.proto new file mode 100644 index 0000000..3965d34 --- /dev/null +++ b/internal/test-svc/domain/holder.facts.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package domain.facts; + +option go_package = "github.com/xoe-labs/ddd-gen/internal/test-svc/domain"; + +import "google/protobuf/timestamp.proto"; + +message HolderCreated { + enum HolderType { + LOCAL = 0; + REMOTE = 1; + } + string name = 1; + string altname = 2; + HolderType h_typ = 3; + google.protobuf.Timestamp bday = 16; +} + diff --git a/internal/test-svc/domain/holder/holder.go b/internal/test-svc/domain/holder/holder.go deleted file mode 100644 index 7aebf6c..0000000 --- a/internal/test-svc/domain/holder/holder.go +++ /dev/null @@ -1,36 +0,0 @@ -package holder - -import ( - "fmt" - "time" -) - -type HolderType struct{ s string } - -func (p HolderType) String() string { return p.s } - -var ( - Local = HolderType{"local"} - Remote = HolderType{"remote"} -) - -//go:generate go run ../../../../main.go --config ../../ddd-config.yaml domain entity -t Holder -v validate -type Holder struct { - name string `entity:"required,field name is empty;stringer"` - altname string `` - bday time.Time `` - hTyp HolderType `entity:"required,filed folder type is empty"` -} - -func (h Holder) validate() error { - if h.altname == h.name { - return fmt.Errorf("altname equals name") - } - return nil -} - -// Apply applies facts to Holder -// implements application layer's entity interface. -func (h *Holder) Apply(fact interface{}) { - // TODO: ipmlement -} diff --git a/internal/test-svc/domain/holder/holder_gen.go b/internal/test-svc/domain/holder/holder_gen.go deleted file mode 100644 index e60f5bc..0000000 --- a/internal/test-svc/domain/holder/holder_gen.go +++ /dev/null @@ -1,71 +0,0 @@ -// Code generated by 'ddd-gen domain entity', DO NOT EDIT. -package holder - -import ( - "errors" - "fmt" - "reflect" - "time" -) - -// Constructors ... - -// New returns a guaranteed-to-be-valid Holder or an error -func New(name string, altname string, bday time.Time, hTyp HolderType) (*Holder, error) { - if reflect.ValueOf(name).IsZero() { - return nil, errors.New("field name is empty") - } - if reflect.ValueOf(hTyp).IsZero() { - return nil, errors.New("filed folder type is empty") - } - h := &Holder{ - altname: altname, - bday: bday, - hTyp: hTyp, - name: name, - } - if err := h.validate(); err != nil { - return nil, err - } - return h, nil -} - -// MustNew returns a guaranteed-to-be-valid Holder or panics -func MustNew(name string, altname string, bday time.Time, hTyp HolderType) *Holder { - h, err := New(name, altname, bday, hTyp) - if err != nil { - panic(err) - } - return h -} - -// Marshalers ... - -// UnmarshalFromStore unmarshals Holder from the repository so that non-constructable -// private fields can still be initialized from (private) repository state -// -// Important: DO NEVER USE THIS METHOD EXCEPT FROM THE REPOSITORY -// Reason: This method initializes private state, so you could corrupt the domain. -func UnmarshalFromStore(name string, altname string, bday time.Time, hTyp HolderType) *Holder { - h := MustNew(name, altname, bday, hTyp) - return h -} - -// Accessors ... - -// Utilities ... - -// Equal answers whether v is equivalent to h -// Always returns false if v is not a Holder -func (h Holder) Equal(v interface{}) bool { - other, ok := v.(Holder) - if !ok { - return false - } - return true -} - -// String implements the fmt.Stringer interface and returns the native format of Holder -func (h Holder) String() string { - return fmt.Sprintf("%s ", h.name) -} diff --git a/internal/test-svc/domain/make_new_account_gen.go b/internal/test-svc/domain/make_new_account_gen.go deleted file mode 100644 index cb5c1e0..0000000 --- a/internal/test-svc/domain/make_new_account_gen.go +++ /dev/null @@ -1,27 +0,0 @@ -// Code generated by 'ddd-gen domain', DO NOT EDIT. -package domain - -import account "github.com/xoe-labs/ddd-gen/internal/test-svc/domain/Account" - -// Facts returns collected domain facts -// implements application layer's FactKeeper interface. -func (mna *MakeNewAccount) Facts() []interface{} { - return mna.facts -} - -// Errors returns collected domain errors -// implements application layer's ErrorKeeper interface. -func (mna *MakeNewAccount) Errors() []error { - return mna.errors -} - -// raise records domain errors -func (mna *MakeNewAccount) raise(err error) { - mna.errors = append(mna.errors, err) -} - -// recordOn records facts and applies them to the domain -func (mna *MakeNewAccount) recordOn(a *account.Account, fact interface{}) { - a.Apply(fact) - mna.facts = append(mna.facts, fact) -}