feat(core): specify event listener API (#14735)

This commit is contained in:
Aaron Craelius 2023-01-24 12:41:05 -05:00 committed by GitHub
parent 8dbdfea9ef
commit e822585666
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 0 deletions

32
core/appmodule/event.go Normal file
View File

@ -0,0 +1,32 @@
package appmodule
import (
"context"
"google.golang.org/protobuf/runtime/protoiface"
)
// HasEventListeners is the extension interface that modules should implement to register
// event listeners.
type HasEventListeners interface {
AppModule
// RegisterEventListeners registers the module's events listeners.
RegisterEventListeners(registrar *EventListenerRegistrar)
}
// EventListenerRegistrar allows registering event listeners.
type EventListenerRegistrar struct {
listeners []any
}
// GetListeners gets the event listeners that have been registered
func (e *EventListenerRegistrar) GetListeners() []any {
return e.listeners
}
// RegisterEventListener registers an event listener for event type E. If a non-nil error is returned by the listener,
// it will cause the process which emitted the event to fail.
func RegisterEventListener[E protoiface.MessageV1](registrar *EventListenerRegistrar, listener func(context.Context, E) error) {
registrar.listeners = append(registrar.listeners, listener)
}

View File

@ -0,0 +1,17 @@
package appmodule
import (
"context"
"reflect"
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/timestamppb"
)
func TestEventListenerRegistrar(t *testing.T) {
registrar := &EventListenerRegistrar{}
RegisterEventListener(registrar, func(ctx context.Context, dummy *timestamppb.Timestamp) error { return nil })
require.Len(t, registrar.listeners, 1)
require.Equal(t, reflect.Func, reflect.TypeOf(registrar.listeners[0]).Kind())
}