From 7692d2cb8d89aae2fa7e55881fc1055f3392f32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Mon, 5 Jun 2023 23:30:10 +0200 Subject: [PATCH] preserve reused code --- internal/api/grpc/fields.go | 36 ++++++++++++++++++++++++++++++++++++ internal/command/command.go | 14 ++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 internal/api/grpc/fields.go diff --git a/internal/api/grpc/fields.go b/internal/api/grpc/fields.go new file mode 100644 index 000000000..f0c9d30a6 --- /dev/null +++ b/internal/api/grpc/fields.go @@ -0,0 +1,36 @@ +package grpc + +import ( + "testing" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +// AllFieldsSet recusively checks if all values in a message +// have a non-zero value. +func AllFieldsSet(t testing.TB, msg protoreflect.Message, ignoreTypes ...protoreflect.FullName) { + ignore := make(map[protoreflect.FullName]bool, len(ignoreTypes)) + for _, name := range ignoreTypes { + ignore[name] = true + } + + md := msg.Descriptor() + name := md.FullName() + if ignore[name] { + return + } + + fields := md.Fields() + + for i := 0; i < fields.Len(); i++ { + fd := fields.Get(i) + if !msg.Has(fd) { + t.Errorf("not all fields set in %q, missing %q", name, fd.Name()) + continue + } + + if fd.Kind() == protoreflect.MessageKind { + AllFieldsSet(t, msg.Get(fd).Message(), ignoreTypes...) + } + } +} diff --git a/internal/command/command.go b/internal/command/command.go index 28e869af2..1b72dd9e0 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -141,11 +141,21 @@ func StartCommands( return repo, nil } -func AppendAndReduce(object interface { +type AppendReducer interface { AppendEvents(...eventstore.Event) // TODO: Why is it allowed to return an error here? Reduce() error -}, events ...eventstore.Event) error { +} + +func (c *Commands) pushAppendAndReduce(ctx context.Context, object AppendReducer, cmds ...eventstore.Command) error { + events, err := c.eventstore.Push(ctx, cmds...) + if err != nil { + return err + } + return AppendAndReduce(object, events...) +} + +func AppendAndReduce(object AppendReducer, events ...eventstore.Event) error { object.AppendEvents(events...) return object.Reduce() }