From 06c0b8bb82401f1bc225f6b9b629fe4b01f1148a Mon Sep 17 00:00:00 2001 From: veith Date: Tue, 12 Nov 2024 12:37:05 +0100 Subject: [PATCH 1/2] feat: [open-models] generate with short names for better DX --- .../pkg/generator/Imports.go | 13 ++-- .../pkg/generator/LiteralType.go | 10 ++- .../pkg/generator/ModelType.go | 3 +- .../pkg/generator/ServiceType.go | 16 ++-- .../pkg/generator/TransportType.go | 3 +- .../pkg/generator/generator.go | 10 +-- .../pkg/generator/modelTypeResolver.go | 76 +++++++++++-------- .../pkg/generator/reservedWords.go | 13 ++++ .../pkg/generator/typeResolver.go | 26 ++++--- 9 files changed, 107 insertions(+), 63 deletions(-) create mode 100644 protoc-gen-open-models/pkg/generator/reservedWords.go diff --git a/protoc-gen-open-models/pkg/generator/Imports.go b/protoc-gen-open-models/pkg/generator/Imports.go index 8b24061..d806965 100644 --- a/protoc-gen-open-models/pkg/generator/Imports.go +++ b/protoc-gen-open-models/pkg/generator/Imports.go @@ -7,14 +7,17 @@ import ( type ImportMap struct { // map[__modulepath__]map[__import__]bool - Imports map[string]map[string]bool + Imports map[string]map[string]string + // ^ ^ ^ + // | | | + // modulepath class fullqualified class } -func (im ImportMap) AddImport(typescriptModulePath string, cls string) { +func (im ImportMap) AddImport(typescriptModulePath string, className string, fullQualifiedClassName string) { if im.Imports[typescriptModulePath] == nil { - im.Imports[typescriptModulePath] = map[string]bool{} + im.Imports[typescriptModulePath] = map[string]string{} } - im.Imports[typescriptModulePath][cls] = true + im.Imports[typescriptModulePath][className] = fullQualifiedClassName } func (im ImportMap) Render() string { @@ -33,6 +36,6 @@ func (im ImportMap) Render() string { var ImportTemplate = ` {{- range $import, $clsMap := .Imports}} -{{ $first := true }}import { {{range $cls, $_ := $clsMap}}{{if not $first}}, {{else}}{{$first = false}}{{end}}{{$cls}}{{end}} } from "{{$import}}"; +{{ $first := true }}import { {{range $cls, $as := $clsMap}}{{if not $first}}, {{else}}{{$first = false}}{{end}}{{$cls}}{{if $as}} as {{$as}}{{end}}{{end}} } from "{{$import}}"; {{end}} ` diff --git a/protoc-gen-open-models/pkg/generator/LiteralType.go b/protoc-gen-open-models/pkg/generator/LiteralType.go index 9ab0bac..e0fbb2a 100644 --- a/protoc-gen-open-models/pkg/generator/LiteralType.go +++ b/protoc-gen-open-models/pkg/generator/LiteralType.go @@ -52,7 +52,7 @@ func (r *LiteralType) Render() string { func prepareLiteralType(message *sourceinfo.MessageInfo, imports ImportMap) LiteralType { literalType := LiteralType{ - Name: fullQualifiedName(message.Package, fullQualifiedName(message.Name, "")), + Name: PrefixReservedWords(strcase.ToCamel(message.Name)), Fields: nil, LeadingComments: multilineComment(message.Info.GetLeadingComments()), } @@ -76,3 +76,11 @@ func fullQualifiedName(pkg string, name string) string { return strcase.ToCamel(strings.Join(p, "")) + name } + +func dotToCamel(name string) string { + p := []string{} + for _, s := range strings.Split(name, ".") { + p = append(p, strings.ToUpper(s[:1])+s[1:]) + } + return strcase.ToCamel(strings.Join(p, "")) +} diff --git a/protoc-gen-open-models/pkg/generator/ModelType.go b/protoc-gen-open-models/pkg/generator/ModelType.go index 6018679..e5b81b1 100644 --- a/protoc-gen-open-models/pkg/generator/ModelType.go +++ b/protoc-gen-open-models/pkg/generator/ModelType.go @@ -7,6 +7,7 @@ import ( "github.com/bufbuild/protoplugin" "github.com/eclipse/eclipsefuro/protoc-gen-open-models/pkg/sourceinfo" openapi_v3 "github.com/google/gnostic/openapiv3" + "github.com/iancoleman/strcase" "slices" "strings" "text/template" @@ -178,7 +179,7 @@ func prepareModelType(message *sourceinfo.MessageInfo, imports ImportMap, si sou readonlyFields := []string{} modelType := ModelType{ - Name: fullQualifiedName(message.Package, fullQualifiedName(message.Name, "")), + Name: PrefixReservedWords(strcase.ToCamel(message.Name)), Fields: nil, LeadingComments: multilineComment(message.Info.GetLeadingComments()), MetaTypeName: message.Package + "." + message.Name, diff --git a/protoc-gen-open-models/pkg/generator/ServiceType.go b/protoc-gen-open-models/pkg/generator/ServiceType.go index d3a87a9..da4810f 100644 --- a/protoc-gen-open-models/pkg/generator/ServiceType.go +++ b/protoc-gen-open-models/pkg/generator/ServiceType.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "github.com/eclipse/eclipsefuro/protoc-gen-open-models/pkg/sourceinfo" + "github.com/iancoleman/strcase" "google.golang.org/genproto/googleapis/api/annotations" "path/filepath" "strings" @@ -63,17 +64,17 @@ func (r *ServiceType) Render() string { func prepareServiceType(service sourceinfo.ServiceInfo, imports ImportMap) ServiceType { - imports.AddImport("@furo/open-models/dist/Fetcher", "Fetcher") + imports.AddImport("@furo/open-models/dist/Fetcher", "Fetcher", "") pathSegments := strings.Split(service.Package, ".") for i, _ := range pathSegments { pathSegments[i] = ".." } - imports.AddImport(strings.Join(pathSegments, "/")+"/API_OPTIONS", "API_OPTIONS") + imports.AddImport(strings.Join(pathSegments, "/")+"/API_OPTIONS", "API_OPTIONS", "") serviceType := ServiceType{ - Name: fullQualifiedName(service.Package, service.Name), + Name: strcase.ToCamel(service.Name), Methods: make([]ServiceMethods, 0, len(service.Methods)), LeadingComments: multilineComment(service.Info.GetLeadingComments()), Package: service.Package, @@ -83,7 +84,8 @@ func prepareServiceType(service sourceinfo.ServiceInfo, imports ImportMap) Servi requestTypeFQ := fullQualifiedTypeName(method.Method.GetInputType()) responseTypeFQ := fullQualifiedTypeName(method.Method.GetOutputType()) - + classNameOut := allTypes[method.Method.GetOutputType()].Name + classNameIn := allTypes[method.Method.GetInputType()].Name fieldPackage := strings.Split("."+service.Package, ".") relIn, _ := filepath.Rel(strings.Join(fieldPackage, "/"), "/"+typenameToPath(method.Method.GetInputType())) @@ -94,14 +96,14 @@ func prepareServiceType(service sourceinfo.ServiceInfo, imports ImportMap) Servi if !strings.HasPrefix(relOut, "..") { relOut = "./" + relOut } - imports.AddImport(relIn, "I"+requestTypeFQ) - imports.AddImport(relOut, "I"+responseTypeFQ) + imports.AddImport(relIn, PrefixReservedWords(classNameIn), "I"+requestTypeFQ) + imports.AddImport(relOut, PrefixReservedWords(classNameOut), "I"+responseTypeFQ) verb, path, err := extractPathAndPattern(method.HttpRule.ApiOptions) // on err, we have no REST endpoints if err == nil { serviceMethods := ServiceMethods{ - Name: method.Name, + Name: PrefixReservedWords(method.Name), RequestTypeLiteral: "I" + requestTypeFQ, ResponseTypeLiteral: "I" + responseTypeFQ, Verb: verb, diff --git a/protoc-gen-open-models/pkg/generator/TransportType.go b/protoc-gen-open-models/pkg/generator/TransportType.go index 41407ff..8729350 100644 --- a/protoc-gen-open-models/pkg/generator/TransportType.go +++ b/protoc-gen-open-models/pkg/generator/TransportType.go @@ -3,6 +3,7 @@ package generator import ( "bytes" "github.com/eclipse/eclipsefuro/protoc-gen-open-models/pkg/sourceinfo" + "github.com/iancoleman/strcase" "text/template" ) @@ -50,7 +51,7 @@ export interface T{{.Name}} { func prepareTransportType(message *sourceinfo.MessageInfo, imports ImportMap) TransportType { transportType := TransportType{ - Name: fullQualifiedName(message.Package, fullQualifiedName(message.Name, "")), + Name: PrefixReservedWords(strcase.ToCamel(message.Name)), Fields: nil, LeadingComments: multilineComment(message.Info.GetLeadingComments()), } diff --git a/protoc-gen-open-models/pkg/generator/generator.go b/protoc-gen-open-models/pkg/generator/generator.go index f5e2267..dfeb191 100644 --- a/protoc-gen-open-models/pkg/generator/generator.go +++ b/protoc-gen-open-models/pkg/generator/generator.go @@ -136,7 +136,7 @@ func createEnum(si sourceinfo.SourceInfo, enum *sourceinfo.EnumInfo) string { options = append(options, o) } - content := "export enum " + fullQualifiedName(enum.Package, fullQualifiedName(enum.Name, "")) + " {\n" + strings.Join(options, "\n") + "\n}" + content := "export enum " + dotToCamel(PrefixReservedWords(enum.Name)) + " {\n" + strings.Join(options, "\n") + "\n}" parts := []string{ "// Code generated by furo protoc-gen-open-models. DO NOT EDIT.", "// protoc-gen-open-models version: ????", @@ -149,9 +149,9 @@ func createEnum(si sourceinfo.SourceInfo, enum *sourceinfo.EnumInfo) string { func createOpenModel(si sourceinfo.SourceInfo, message *sourceinfo.MessageInfo, request protoplugin.Request) string { - imports := ImportMap{Imports: make(map[string]map[string]bool)} - imports.AddImport("@furo/open-models/dist/index", "FieldNode") - imports.AddImport("@furo/open-models/dist/index", "Registry") + imports := ImportMap{Imports: make(map[string]map[string]string)} + imports.AddImport("@furo/open-models/dist/index", "FieldNode", "") + imports.AddImport("@furo/open-models/dist/index", "Registry", "") literalType := prepareLiteralType(message, imports) transportType := prepareTransportType(message, imports) @@ -170,7 +170,7 @@ func createOpenModel(si sourceinfo.SourceInfo, message *sourceinfo.MessageInfo, } func createOpenModelService(si sourceinfo.SourceInfo, service sourceinfo.ServiceInfo) string { - imports := ImportMap{Imports: make(map[string]map[string]bool)} + imports := ImportMap{Imports: make(map[string]map[string]string)} serviveType := prepareServiceType(service, imports) parts := []string{ "// Code generated by furo protoc-gen-open-models. DO NOT EDIT.", diff --git a/protoc-gen-open-models/pkg/generator/modelTypeResolver.go b/protoc-gen-open-models/pkg/generator/modelTypeResolver.go index 857874b..29c36f5 100644 --- a/protoc-gen-open-models/pkg/generator/modelTypeResolver.go +++ b/protoc-gen-open-models/pkg/generator/modelTypeResolver.go @@ -50,8 +50,8 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( if t, ok := ModelTypesMap[fieldType]; ok { primitiveType := PrimitivesMap[fieldType] if field.Field.Label.String() == "LABEL_REPEATED" { - imports.AddImport("@furo/open-models/dist/index", "ARRAY") - imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[fieldType]) + imports.AddImport("@furo/open-models/dist/index", "ARRAY", "") + imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[fieldType], "") return "ARRAY<" + t + ", " + primitiveType + ">", "__TypeSetter", primitiveType + "[]", @@ -59,7 +59,7 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( "", // ARRAY is uses a typesetter t } - imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[fieldType]) + imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[fieldType], "") return t, "__PrimitivesSetter", primitiveType, t, "", t } @@ -80,6 +80,7 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( if *nested.Field[1].Type == descriptorpb.FieldDescriptorProto_TYPE_MESSAGE { // message m := *nested.Field[1].TypeName + className := allTypes[m].Name maptype = m[1:len(m)] // WELL KNOWN @@ -89,15 +90,15 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( // ANY if typeName == "Any" { - imports.AddImport("@furo/open-models/dist/index", "type IAny") - imports.AddImport("@furo/open-models/dist/index", "ANY") + imports.AddImport("@furo/open-models/dist/index", "type IAny", "") + imports.AddImport("@furo/open-models/dist/index", "ANY", "") return "ANY", "__TypeSetter", "IAny", "ANY", "", "ANY" } primitiveMapType := WellKnownTypesMap[typeName] // for model types return "MAP;" - imports.AddImport("@furo/open-models/dist/index", "MAP") - imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[primitiveMapType]) + imports.AddImport("@furo/open-models/dist/index", "MAP", "") + imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[primitiveMapType], "") return "MAP", "__TypeSetter", "{ [key: string]: " + PrimitivesMap[primitiveMapType] + " }", @@ -111,8 +112,8 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( if !strings.HasPrefix(rel, "..") { rel = "./" + rel } - imports.AddImport(rel, fullQualifiedName(maptype, "")) - imports.AddImport("@furo/open-models/dist/index", "MAP") + imports.AddImport(rel, PrefixReservedWords(className), fullQualifiedName(maptype, "")) + imports.AddImport("@furo/open-models/dist/index", "MAP", "") return "MAP", "__TypeSetter", @@ -123,8 +124,8 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( } } // for model types return "MAP;" - imports.AddImport("@furo/open-models/dist/index", "MAP") - imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[maptype]) + imports.AddImport("@furo/open-models/dist/index", "MAP", "") + imports.AddImport("@furo/open-models/dist/index", ModelTypesMap[maptype], "") return "MAP", "__TypeSetter", "{ [key: string]: " + PrimitivesMap[maptype] + " }", @@ -146,17 +147,18 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( // ANY if typeName == "Any" { - imports.AddImport("@furo/open-models/dist/index", "type IAny") - imports.AddImport("@furo/open-models/dist/index", "ANY") + imports.AddImport("@furo/open-models/dist/index", "type IAny", "") + imports.AddImport("@furo/open-models/dist/index", "ANY", "") return "ANY", "__TypeSetter", "IAny", "ANY", "", "ANY" } primitiveType := WellKnownTypesMap[typeName] - imports.AddImport("@furo/open-models/dist/index", typeName) + imports.AddImport("@furo/open-models/dist/index", typeName, "") return typeName, "__TypeSetter", primitiveType + "| null", typeName, "", typeName } // MESSAGE t := field.Field.GetTypeName() + className := dotToCamel(allTypes[t].Name) if strings.HasPrefix(t, ".") { t = t[1:] } @@ -168,12 +170,21 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( // do not add import for the same file (direct recursion types) t = fullQualifiedName(t, "") if field.Message.GetName() != importFile { - imports.AddImport("./"+importFile, t) + imports.AddImport("./"+importFile, PrefixReservedWords(className), t) } if field.Field.Label.String() == "LABEL_REPEATED" { - imports.AddImport("@furo/open-models/dist/index", "ARRAY") + imports.AddImport("@furo/open-models/dist/index", "ARRAY", "") + // if we are in the same package, we use the classNames + if field.Field.GetTypeName() == "."+field.Package+"."+field.Message.GetName() { + return "ARRAY<" + className + ", I" + className + ">", + "__TypeSetter", + "I" + className + "[]", + "ARRAY<" + className + ", I" + className + ">", + "", + className + } return "ARRAY<" + t + ", I" + t + ">", "__TypeSetter", "I" + t + "[]", @@ -183,23 +194,23 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( } // if a field type equals the package name + message type we have a direct recusrion if field.Field.GetTypeName() == "."+field.Package+"."+field.Message.GetName() { - imports.AddImport("@furo/open-models/dist/index", "RECURSION") - return "RECURSION<" + t + ", I" + t + ">", + imports.AddImport("@furo/open-models/dist/index", "RECURSION", "") + return "RECURSION<" + className + ", I" + className + ">", "__TypeSetter", - "I" + t, - "RECURSION<" + t + ", I" + t + ">", + "I" + className, + "RECURSION<" + className + ", I" + className + ">", "", - t + className } // todo: check for deep recursion if deepRecursionCheck(field.Field.GetTypeName()) { - imports.AddImport("@furo/open-models/dist/index", "RECURSION") - return "RECURSION<" + t + ", I" + t + ">", + imports.AddImport("@furo/open-models/dist/index", "RECURSION", "") + return "RECURSION<" + className + ", I" + className + ">", "__TypeSetter", - "I" + t, - "RECURSION<" + t + ", I" + t + ">", + "I" + className, + "RECURSION<" + className + ", I" + className + ">", "", - t + className } return t, "__TypeSetter", "I" + t, t, "", t @@ -220,10 +231,10 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( // do not add import for the same file (direct recursion types) t = fullQualifiedName(t, "") if field.Message.GetName() != importFile { - imports.AddImport(rel, t) + imports.AddImport(rel, PrefixReservedWords(className), t) } if field.Field.Label.String() == "LABEL_REPEATED" { - imports.AddImport("@furo/open-models/dist/index", "ARRAY") + imports.AddImport("@furo/open-models/dist/index", "ARRAY", "") return "ARRAY<" + t + ", I" + t + ">", "__TypeSetter", @@ -239,6 +250,7 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( } if fieldType == "TYPE_ENUM" { t := field.Field.GetTypeName() + className := dotToCamel(allEnums[t].Name) if strings.HasPrefix(t, ".") { t = t[1:] } @@ -248,8 +260,8 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( importFile := t[len(field.Package)+1:] fqn := fullQualifiedName(t, "") - imports.AddImport("@furo/open-models/dist/index", "ENUM") - imports.AddImport("./"+importFile, fqn) + imports.AddImport("@furo/open-models/dist/index", "ENUM", "") + imports.AddImport("./"+importFile, PrefixReservedWords(className), fqn) // create correct importFile for nested types return "ENUM<" + fqn + ">", "__TypeSetter", fqn, "ENUM<" + fqn + ">", "", "ENUM<" + fqn + ">" @@ -264,8 +276,8 @@ func resolveModelType(imports ImportMap, field sourceinfo.FieldInfo) ( fqn := fullQualifiedName(t, "") // enum are without prefix - imports.AddImport("@furo/open-models/dist/index", "ENUM") - imports.AddImport(rel, fqn) + imports.AddImport("@furo/open-models/dist/index", "ENUM", "") + imports.AddImport(rel, PrefixReservedWords(className), fqn) if field.Field.Label.String() == "LABEL_REPEATED" { return "ENUM<" + fqn + ">", "__TypeSetter", fqn, "ENUM<" + fqn + ">", "", "ENUM<" + fqn + ">" } diff --git a/protoc-gen-open-models/pkg/generator/reservedWords.go b/protoc-gen-open-models/pkg/generator/reservedWords.go new file mode 100644 index 0000000..0cd31af --- /dev/null +++ b/protoc-gen-open-models/pkg/generator/reservedWords.go @@ -0,0 +1,13 @@ +package generator + +var ReservedWords = map[string]struct{}{ + "Object": {}, + "Any": {}, +} + +func PrefixReservedWords(className string) string { + if _, ok := ReservedWords[className]; ok { + return "X" + className + } + return className +} diff --git a/protoc-gen-open-models/pkg/generator/typeResolver.go b/protoc-gen-open-models/pkg/generator/typeResolver.go index 0e174b9..eb04591 100644 --- a/protoc-gen-open-models/pkg/generator/typeResolver.go +++ b/protoc-gen-open-models/pkg/generator/typeResolver.go @@ -55,6 +55,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre // message m := *nested.Field[1].TypeName maptype = m[1:len(m)] + className := allTypes[m].Name // WELL KNOWN if isWellKnownType(tn) { @@ -62,13 +63,13 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre typeName := ts[len(ts)-1] if typeName == "Any" { - imports.AddImport("@furo/open-models/dist/index", "type IAny") + imports.AddImport("@furo/open-models/dist/index", "type IAny", "") return "IAny" } // well known types are using primitives primitiveMapType := WellKnownTypesMap[typeName] - imports.AddImport("@furo/open-models/dist/index", typeName) + imports.AddImport("@furo/open-models/dist/index", typeName, "") return "{ [key: string]: " + PrimitivesMap[primitiveMapType] + " }" } fieldPackage := strings.Split("."+field.Package, ".") @@ -76,7 +77,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre if !strings.HasPrefix(rel, "..") { rel = "./" + rel } - imports.AddImport(rel, kindPrefix+fullQualifiedName(maptype, "")) + imports.AddImport(rel, kindPrefix+PrefixReservedWords(className), kindPrefix+fullQualifiedName(maptype, "")) return "{ [key: string]: " + kindPrefix + fullQualifiedName(maptype, "") + " }" } } @@ -95,13 +96,13 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre typeName := ts[len(ts)-1] if typeName == "Any" { - imports.AddImport("@furo/open-models/dist/index", "type IAny") + imports.AddImport("@furo/open-models/dist/index", "type IAny", "") return "IAny" } // well known types are using primitives primitiveType := WellKnownTypesMap[typeName] - imports.AddImport("@furo/open-models/dist/index", typeName) + imports.AddImport("@furo/open-models/dist/index", typeName, "") return primitiveType } @@ -109,6 +110,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre // MESSAGE t := field.Field.GetTypeName() + className := dotToCamel(allTypes[t].Name) if strings.HasPrefix(t, ".") { t = t[1:] } @@ -121,8 +123,9 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre // add imports for Transport, Literal and Model // do not add import for the same file (direct recursion types) if field.Message.GetName() != importFile { - - imports.AddImport("./"+importFile, kindPrefix+t) + imports.AddImport("./"+importFile, kindPrefix+PrefixReservedWords(className), kindPrefix+t) + } else { + return kindPrefix + className } if field.Field.Label.String() == "LABEL_REPEATED" { return kindPrefix + t + "[]" @@ -142,7 +145,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre // do not add import for the same file (direct recursion types) t = fullQualifiedName(t, "") if field.Message.GetName() != importFile { - imports.AddImport(rel, kindPrefix+t) + imports.AddImport(rel, kindPrefix+PrefixReservedWords(className), kindPrefix+t) } if field.Field.Label.String() == "LABEL_REPEATED" { return kindPrefix + t + "[]" @@ -154,6 +157,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre } if fieldType == "TYPE_ENUM" { t := field.Field.GetTypeName() + className := dotToCamel(allEnums[t].Name) if strings.HasPrefix(t, ".") { t = t[1:] } @@ -164,7 +168,7 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre fqn := fullQualifiedName(t, "") // enum are without prefix - imports.AddImport("./"+importFile, fqn) + imports.AddImport("./"+importFile, PrefixReservedWords(className), fqn) if field.Field.Label.String() == "LABEL_REPEATED" { return fqn + "[]" } @@ -181,8 +185,8 @@ func resolveInterfaceType(imports ImportMap, field sourceinfo.FieldInfo, kindPre fqn := fullQualifiedName(t, "") // enum are without prefix - imports.AddImport("@furo/open-models/dist/index", "ENUM") - imports.AddImport(rel, fqn) + imports.AddImport("@furo/open-models/dist/index", "ENUM", "") + imports.AddImport(rel, PrefixReservedWords(className), fqn) if field.Field.Label.String() == "LABEL_REPEATED" { return fqn + "[]" } From b7b337c0b69aef23584310b001044b04d246dedf Mon Sep 17 00:00:00 2001 From: veith Date: Tue, 12 Nov 2024 13:58:27 +0100 Subject: [PATCH 2/2] fix: [open-models] import correct interface type for services --- protoc-gen-open-models/pkg/generator/ServiceType.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protoc-gen-open-models/pkg/generator/ServiceType.go b/protoc-gen-open-models/pkg/generator/ServiceType.go index da4810f..0fd9216 100644 --- a/protoc-gen-open-models/pkg/generator/ServiceType.go +++ b/protoc-gen-open-models/pkg/generator/ServiceType.go @@ -96,8 +96,8 @@ func prepareServiceType(service sourceinfo.ServiceInfo, imports ImportMap) Servi if !strings.HasPrefix(relOut, "..") { relOut = "./" + relOut } - imports.AddImport(relIn, PrefixReservedWords(classNameIn), "I"+requestTypeFQ) - imports.AddImport(relOut, PrefixReservedWords(classNameOut), "I"+responseTypeFQ) + imports.AddImport(relIn, "I"+PrefixReservedWords(classNameIn), "I"+requestTypeFQ) + imports.AddImport(relOut, "I"+PrefixReservedWords(classNameOut), "I"+responseTypeFQ) verb, path, err := extractPathAndPattern(method.HttpRule.ApiOptions) // on err, we have no REST endpoints