-
Notifications
You must be signed in to change notification settings - Fork 4
/
well_known.go
51 lines (41 loc) · 1.26 KB
/
well_known.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package proto
import (
"encoding/hex"
"fmt"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protodesc"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/descriptorpb"
)
type WellKnownType struct {
proto string
BytesEncoding string
}
func RegisterWellKnownFileDescriptors(registry *Registry) error {
for _, wt := range wellKnownTypes {
fd, err := protoToFileDescriptor(registry, wt.proto)
if err != nil {
return fmt.Errorf("generating proto file: %w", err)
}
err = registry.RegisterFileDescriptor(fd)
if err != nil {
return fmt.Errorf("registering file descriptor: %w", err)
}
}
return nil
}
func protoToFileDescriptor(registry *Registry, in string) (protoreflect.FileDescriptor, error) {
protoBytes, err := hex.DecodeString(in)
if err != nil {
panic(fmt.Errorf("failed to hex decode payload: %w", err))
}
fileDescriptorProto := &descriptorpb.FileDescriptorProto{}
if err := proto.Unmarshal(protoBytes, fileDescriptorProto); err != nil {
return nil, fmt.Errorf("failed to unmarshal file descriptor: %w", err)
}
fd, err := protodesc.NewFile(fileDescriptorProto, registry.Files)
if err != nil {
return nil, fmt.Errorf("creating new file descriptor: %w", err)
}
return fd, nil
}