Skip to content

Commit f037b97

Browse files
author
Andrew Poydence
committed
Enable an implementing type to have peer types
1 parent 048c0c9 commit f037b97

File tree

4 files changed

+89
-12
lines changed

4 files changed

+89
-12
lines changed

pubsub-gen/internal/end2end/end2end_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ func TestEnd2End(t *testing.T) {
6060
ps.Subscribe(sub8.write, pubsub.WithPath(StructTraverserCreatePath(&XFilter{MapY: []string{"a", "b"}})))
6161
ps.Subscribe(sub9.write, pubsub.WithPath(StructTraverserCreatePath(&XFilter{E2: &EmptyFilter{}})))
6262
ps.Subscribe(sub10.write, pubsub.WithPath(StructTraverserCreatePath(&XFilter{
63-
M_M3: &M3Filter{},
63+
M_M3: &M3Filter{
64+
A: &M1Filter{
65+
A: setters.Int(9),
66+
},
67+
},
6468
})))
6569

6670
ps.Publish(&X{
@@ -77,7 +81,7 @@ func TestEnd2End(t *testing.T) {
7781
ps.Publish(&X{I: 1, J: "a", Y1: Y{I: 2, J: "b"}, Y2: &Y{I: 1, J: "a"}}, StructTraverserTraverse)
7882
ps.Publish(&X{I: 1, J: "x", Y1: Y{I: 2, J: "b"}}, StructTraverserTraverse)
7983
ps.Publish(&X{I: 1, J: "x", Y1: Y{I: 2, J: "b"}, M: &M2{A: 1, B: 2}}, StructTraverserTraverse)
80-
ps.Publish(&X{M: &M3{}}, StructTraverserTraverse)
84+
ps.Publish(&X{M: &M3{A: M1{A: 9}}}, StructTraverserTraverse)
8185

8286
Expect(t, sub1.callCount).To(Equal(5))
8387
Expect(t, sub2.callCount).To(Equal(1))

pubsub-gen/internal/end2end/generated_traverser_test.go

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,14 @@ func ___Y1_Y2_E1_E2_M(idx int, data interface{}) (path uint64, nextTraverser pub
181181

182182
case 4:
183183
switch data.(*end2end.X).M.(type) {
184+
case end2end.M1:
185+
return 5, _M_M1_A, true
186+
184187
case *end2end.M2:
185188
return 6, _M_M2_A, true
186189

187190
case *end2end.M3:
188-
// Interface implementation with no fields
189-
return 7, pubsub.TreeTraverser(done), true
190-
191-
case end2end.M1:
192-
return 5, _M_M1_A, true
191+
return 7, _M_M3_A, true
193192

194193
default:
195194
return 0, pubsub.TreeTraverser(done), true
@@ -537,6 +536,45 @@ func _M_M3(data interface{}) pubsub.Paths {
537536
})
538537
}
539538

539+
func ___M_M3_A(idx int, data interface{}) (path uint64, nextTraverser pubsub.TreeTraverser, ok bool) {
540+
switch idx {
541+
542+
case 0:
543+
544+
return 1, pubsub.TreeTraverser(_M_M3_A_A), true
545+
546+
default:
547+
return 0, nil, false
548+
}
549+
}
550+
551+
func _M_M3_A(data interface{}) pubsub.Paths {
552+
553+
return pubsub.Paths(func(idx int, data interface{}) (path uint64, nextTraverser pubsub.TreeTraverser, ok bool) {
554+
switch idx {
555+
case 0:
556+
return 1, pubsub.TreeTraverser(_M_M3_A_A), true
557+
default:
558+
return 0, nil, false
559+
}
560+
})
561+
}
562+
563+
func _M_M3_A_A(data interface{}) pubsub.Paths {
564+
565+
return pubsub.Paths(func(idx int, data interface{}) (path uint64, nextTraverser pubsub.TreeTraverser, ok bool) {
566+
switch idx {
567+
case 0:
568+
return 0, pubsub.TreeTraverser(done), true
569+
case 1:
570+
571+
return hashUint64(uint64(data.(*end2end.X).M.(*end2end.M3).A.A)), pubsub.TreeTraverser(done), true
572+
default:
573+
return 0, nil, false
574+
}
575+
})
576+
}
577+
540578
type XFilter struct {
541579
I *int
542580
J *string
@@ -572,6 +610,7 @@ type M2Filter struct {
572610
}
573611

574612
type M3Filter struct {
613+
A *M1Filter
575614
}
576615

577616
func StructTraverserCreatePath(f *XFilter) []uint64 {
@@ -926,9 +965,38 @@ func createPath__M_M3(f *M3Filter) []uint64 {
926965
path = append(path, 7)
927966

928967
var count int
968+
if f.A != nil {
969+
count++
970+
}
971+
929972
if count > 1 {
930973
panic("Only one field can be set")
931974
}
932975

976+
path = append(path, createPath__M3_A(f.A)...)
977+
978+
return path
979+
}
980+
981+
func createPath__M3_A(f *M1Filter) []uint64 {
982+
if f == nil {
983+
return nil
984+
}
985+
var path []uint64
986+
987+
path = append(path, 1)
988+
989+
var count int
990+
if count > 1 {
991+
panic("Only one field can be set")
992+
}
993+
994+
if f.A != nil {
995+
996+
path = append(path, hashUint64(uint64(*f.A)))
997+
} else {
998+
path = append(path, 0)
999+
}
1000+
9331001
return path
9341002
}

pubsub-gen/internal/end2end/test_types.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ type M2 struct {
4040

4141
func (m *M2) message() {}
4242

43-
type M3 struct{}
43+
type M3 struct {
44+
A M1
45+
//I int TODO
46+
}
4447

4548
func (m *M3) message() {}

pubsub-gen/internal/generator/traverser_generator.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,15 @@ func (g TraverserGenerator) generateStructFns(
189189
implementersWithFields := make(map[string]string)
190190
for _, impl := range implementers {
191191
trimmedImpl := strings.Trim(impl, "*")
192-
if len(m[trimmedImpl].Fields) == 0 {
192+
if len(m[trimmedImpl].Fields) == 0 && len(m[trimmedImpl].PeerTypeFields) == 0 {
193193
implementersWithFields[impl] = ""
194194
continue
195195
}
196196

197197
var name string
198-
if len(m[trimmedImpl].Fields) > 0 {
198+
if len(m[trimmedImpl].PeerTypeFields) > 0 {
199+
name = m[trimmedImpl].PeerTypeFields[0].Name
200+
} else if len(m[trimmedImpl].Fields) > 0 {
199201
name = m[trimmedImpl].Fields[0].Name
200202
}
201203

@@ -290,7 +292,7 @@ func hashSplitFn(t, dataValue string, slice inspector.Slice, m inspector.Map) (c
290292
_, value := hashSplitFn(t, x, inspector.Slice{}, inspector.Map{})
291293
return fmt.Sprintf(`
292294
var total uint64
293-
for _, x := range %s{
295+
for _, x := range %s{
294296
total += %s
295297
}`, dataValue, value), "hashUint64(total)"
296298
}
@@ -299,7 +301,7 @@ func hashSplitFn(t, dataValue string, slice inspector.Slice, m inspector.Map) (c
299301
_, value := hashSplitFn(t, "x", inspector.Slice{}, inspector.Map{})
300302
return fmt.Sprintf(`
301303
var total uint64
302-
for x := range %s{
304+
for x := range %s{
303305
total += %s
304306
}`, dataValue, value), "hashUint64(total)"
305307
}

0 commit comments

Comments
 (0)