From 315e09fad934b341fd18b4fecfadfe15327194a8 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Wed, 18 Sep 2024 15:59:21 +0300 Subject: [PATCH] refactor: decouple router to allow adding custom log and input data handlers --- pkg/router/router.go | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 pkg/router/router.go diff --git a/pkg/router/router.go b/pkg/router/router.go new file mode 100644 index 0000000..312f8ff --- /dev/null +++ b/pkg/router/router.go @@ -0,0 +1,88 @@ +package router + +import ( + "context" + + "github.com/celo-org/celo-blockchain/common" + "github.com/celo-org/celo-blockchain/core/types" + "github.com/grassrootseconomics/celo-tracker/pkg/event" +) + +type ( + Callback func(context.Context, event.Event) error + HandlerFunc func(context.Context, interface{}, Callback) error + + LogPayload struct { + Log *types.Log + Timestamp uint64 + } + + LogRouteEntry struct { + Name string + Signature common.Hash + HandlerFunc HandlerFunc + } + + InputDataPayload struct { + From string + InputData string + Block uint64 + ContractAddress string + Timestamp uint64 + TxHash string + } + + InputDataEntry struct { + Name string + Signature string + HandlerFunc HandlerFunc + } + + Router struct { + logHandlers map[common.Hash]LogRouteEntry + inputDataHandlers map[string]InputDataEntry + } +) + +func New() *Router { + return &Router{ + logHandlers: make(map[common.Hash]LogRouteEntry), + inputDataHandlers: make(map[string]InputDataEntry), + } +} + +func (r *Router) RegisterLogRoute(signature common.Hash, handlerFunc HandlerFunc) { + r.logHandlers[signature] = LogRouteEntry{ + Signature: signature, + HandlerFunc: handlerFunc, + } +} + +func (r *Router) RegisterInputDataRoute(signature string, handlerFunc HandlerFunc) { + r.inputDataHandlers[signature] = InputDataEntry{ + Signature: signature, + HandlerFunc: handlerFunc, + } +} + +func (r *Router) ProcessLog(ctx context.Context, payload LogPayload, cb Callback) error { + handler, ok := r.logHandlers[payload.Log.Topics[0]] + if ok { + return handler.HandlerFunc(ctx, payload, cb) + } + + return nil +} + +func (r *Router) ProcessInputData(ctx context.Context, payload InputDataPayload, cb Callback) error { + if len(payload.InputData) < 8 { + return nil + } + + handler, ok := r.inputDataHandlers[payload.InputData[:8]] + if ok { + return handler.HandlerFunc(ctx, payload, cb) + } + + return nil +}