cosmos-sdk/schema/appdata/mux.go
Aaron Craelius 683371f779
feat(schema/appdata): async listener mux'ing (#20879)
Co-authored-by: cool-developer <51834436+cool-develope@users.noreply.github.com>
2024-07-25 13:53:26 +00:00

129 lines
3.0 KiB
Go

package appdata
// ListenerMux returns a listener that forwards received events to all the provided listeners in order.
// A callback is only registered if a non-nil callback is present in at least one of the listeners.
func ListenerMux(listeners ...Listener) Listener {
mux := Listener{}
initModDataCbs := make([]func(ModuleInitializationData) error, 0, len(listeners))
for _, l := range listeners {
if l.InitializeModuleData != nil {
initModDataCbs = append(initModDataCbs, l.InitializeModuleData)
}
}
if len(initModDataCbs) > 0 {
mux.InitializeModuleData = func(data ModuleInitializationData) error {
for _, cb := range initModDataCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
startBlockCbs := make([]func(StartBlockData) error, 0, len(listeners))
for _, l := range listeners {
if l.StartBlock != nil {
startBlockCbs = append(startBlockCbs, l.StartBlock)
}
}
if len(startBlockCbs) > 0 {
mux.StartBlock = func(data StartBlockData) error {
for _, cb := range startBlockCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
onTxCbs := make([]func(TxData) error, 0, len(listeners))
for _, l := range listeners {
if l.OnTx != nil {
onTxCbs = append(onTxCbs, l.OnTx)
}
}
if len(onTxCbs) > 0 {
mux.OnTx = func(data TxData) error {
for _, cb := range onTxCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
onEventCbs := make([]func(EventData) error, 0, len(listeners))
for _, l := range listeners {
if l.OnEvent != nil {
onEventCbs = append(onEventCbs, l.OnEvent)
}
}
if len(onEventCbs) > 0 {
mux.OnEvent = func(data EventData) error {
for _, cb := range onEventCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
onKvPairCbs := make([]func(KVPairData) error, 0, len(listeners))
for _, l := range listeners {
if l.OnKVPair != nil {
onKvPairCbs = append(onKvPairCbs, l.OnKVPair)
}
}
if len(onKvPairCbs) > 0 {
mux.OnKVPair = func(data KVPairData) error {
for _, cb := range onKvPairCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
onObjectUpdateCbs := make([]func(ObjectUpdateData) error, 0, len(listeners))
for _, l := range listeners {
if l.OnObjectUpdate != nil {
onObjectUpdateCbs = append(onObjectUpdateCbs, l.OnObjectUpdate)
}
}
if len(onObjectUpdateCbs) > 0 {
mux.OnObjectUpdate = func(data ObjectUpdateData) error {
for _, cb := range onObjectUpdateCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
commitCbs := make([]func(CommitData) error, 0, len(listeners))
for _, l := range listeners {
if l.Commit != nil {
commitCbs = append(commitCbs, l.Commit)
}
}
if len(commitCbs) > 0 {
mux.Commit = func(data CommitData) error {
for _, cb := range commitCbs {
if err := cb(data); err != nil {
return err
}
}
return nil
}
}
return mux
}