Skip to content

Commit aeed100

Browse files
committed
tidy up
1 parent f74168e commit aeed100

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed

protocol.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package schema_registry
2+
3+
type newSchemaRequest struct {
4+
SchemaType string `json:"schemaType"`
5+
References references `json:"references"`
6+
Schema string `json:"schema"`
7+
}
8+
9+
type references []reference
10+
11+
type reference struct {
12+
Name string `json:"name"`
13+
Subject string `json:"subject"`
14+
Version int `json:"version"`
15+
}
16+
17+
type newSchemaResponse struct {
18+
Id uint32 `json:"id"`
19+
}
20+
21+
type getSchemaResponse struct {
22+
Id uint32 `json:"id"`
23+
SchemaType string `json:"schemaType"`
24+
Schema string `json:"schema"`
25+
References references `json:"references"`
26+
}
27+
28+
type getSchemaSubjectsResponse []subjectVersion
29+
30+
type subjectVersion struct {
31+
Subject string `json:"subject"`
32+
Version int `json:"version"`
33+
}
34+
35+

resolver_proto.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package schema_registry
2+
3+
import (
4+
"context"
5+
"google.golang.org/protobuf/reflect/protoreflect"
6+
"google.golang.org/protobuf/reflect/protoregistry"
7+
"strings"
8+
)
9+
10+
type versionedResolver struct {
11+
ctx context.Context
12+
registry *Client
13+
refs references
14+
}
15+
16+
func (r *versionedResolver) FindFileByPath(subject string) (protoreflect.FileDescriptor, error) {
17+
for _, ref := range r.refs {
18+
if ref.Subject == subject {
19+
schema, err := r.registry.GetSubjectVersion(r.ctx, subject, ref.Version)
20+
if err != nil {
21+
return nil, err
22+
}
23+
return schema.descriptor, nil
24+
}
25+
}
26+
return nil, protoregistry.NotFound
27+
}
28+
29+
func (r *versionedResolver) FindDescriptorByName(name protoreflect.FullName) (protoreflect.Descriptor, error) {
30+
for _, ref := range r.refs {
31+
schema, err := r.registry.GetSubjectVersion(r.ctx, ref.Subject, ref.Version)
32+
if err != nil {
33+
34+
}
35+
if schema == nil {
36+
return nil, protoregistry.NotFound
37+
}
38+
matchParent := false
39+
for p := name.Parent(); p != ""; p = p.Parent() {
40+
if strings.HasSuffix(string(p), string(schema.descriptor.FullName())) {
41+
matchParent = true
42+
}
43+
}
44+
if !matchParent {
45+
continue
46+
}
47+
if m := schema.descriptor.Messages().ByName(name.Name()); m != nil {
48+
return m, nil
49+
}
50+
51+
}
52+
return nil, protoregistry.NotFound
53+
}
54+

schema.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package schema_registry
2+
3+
import (
4+
"crypto/sha256"
5+
"fmt"
6+
"github.com/golang/protobuf/jsonpb"
7+
"github.com/jhump/protoreflect/desc"
8+
"google.golang.org/protobuf/reflect/protodesc"
9+
"google.golang.org/protobuf/reflect/protoreflect"
10+
)
11+
12+
type Schema struct {
13+
descriptor protoreflect.FileDescriptor
14+
definition *desc.FileDescriptor
15+
}
16+
17+
func NewSchema(d protoreflect.FileDescriptor) (*Schema, error) {
18+
var convert func(protoreflect.FileDescriptor, bool) (*desc.FileDescriptor, references, error)
19+
convert = func(in protoreflect.FileDescriptor, dive bool) (*desc.FileDescriptor, references, error) {
20+
fdpb := protodesc.ToFileDescriptorProto(in)
21+
imports := in.Imports()
22+
refs := make(references, 0)
23+
var deps []*desc.FileDescriptor
24+
if dive {
25+
for i := 0; i < imports.Len(); i++ {
26+
imp := imports.Get(i)
27+
dp, rs, err := convert(imp, false)
28+
if err != nil {
29+
return nil, nil, err
30+
}
31+
for _, r := range rs {
32+
refs = append(refs, r)
33+
}
34+
deps = append(deps, dp)
35+
}
36+
}
37+
fd, err := desc.CreateFileDescriptor(fdpb, deps...)
38+
return fd, refs, err
39+
}
40+
file, _, err := convert(d, true)
41+
if err != nil {
42+
return nil, fmt.Errorf("NewSchema.CreateFileDescriptor: %v", err)
43+
}
44+
return &Schema{
45+
definition: file,
46+
descriptor: d,
47+
}, nil
48+
}
49+
50+
func (s Schema) Fingerprint() (*Fingerprint, error) {
51+
m := &jsonpb.Marshaler{
52+
OrigName: true,
53+
EnumsAsInts: true,
54+
EmitDefaults: false,
55+
}
56+
pb := protodesc.ToFileDescriptorProto(s.descriptor)
57+
d, err := m.MarshalToString(pb)
58+
if err != nil {
59+
return nil, err
60+
}
61+
f := Fingerprint(sha256.Sum256([]byte(d)))
62+
return &f, nil
63+
}
64+
65+
type Fingerprint [32]byte
66+
67+
func (f *Fingerprint) Equal(other *Fingerprint) bool {
68+
for i, b := range f {
69+
if other[i] != b {
70+
return false
71+
}
72+
}
73+
return true
74+
}
75+

0 commit comments

Comments
 (0)