protoc-gen-ts/internal/plugin/generate.go

58 lines
1.8 KiB
Go

package plugin
import (
"fmt"
"path"
"strings"
"git.apinb.com/bsm-tools/protoc-gen-ts/internal/codegen"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protodesc"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/descriptorpb"
"google.golang.org/protobuf/types/pluginpb"
)
func Generate(request *pluginpb.CodeGeneratorRequest) (*pluginpb.CodeGeneratorResponse, error) {
AllSrvMethods = make([]SrvMethod, 0)
generate := make(map[string]struct{})
registry, err := protodesc.NewFiles(&descriptorpb.FileDescriptorSet{
File: request.GetProtoFile(),
})
if err != nil {
return nil, fmt.Errorf("create proto registry: %w", err)
}
for _, f := range request.GetFileToGenerate() {
generate[f] = struct{}{}
}
packaged := make(map[protoreflect.FullName][]protoreflect.FileDescriptor)
for _, f := range request.GetFileToGenerate() {
file, err := registry.FindFileByPath(f)
if err != nil {
return nil, fmt.Errorf("find file %s: %w", f, err)
}
packaged[file.Package()] = append(packaged[file.Package()], file)
}
var res pluginpb.CodeGeneratorResponse
for pkg, files := range packaged {
var index codegen.File
indexPathElems := append(strings.Split(string(pkg), "."), "index.ts")
if err := (packageGenerator{pkg: pkg, files: files}).Generate(&index); err != nil {
return nil, fmt.Errorf("generate package '%s': %w", pkg, err)
}
index.P()
index.P("// @@protoc_insertion_point(typescript-http-eof)")
res.File = append(res.File, &pluginpb.CodeGeneratorResponse_File{
Name: proto.String(path.Join(indexPathElems...)),
Content: proto.String(string(index.Content())),
})
}
res.SupportedFeatures = proto.Uint64(uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL))
return &res, nil
}