package main import ( "context" "log" "os" "github.com/go-redis/redis" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/jobs/config" "github.com/wormhole-foundation/wormhole-explorer/jobs/internal/coingecko" "github.com/wormhole-foundation/wormhole-explorer/jobs/jobs" "github.com/wormhole-foundation/wormhole-explorer/jobs/jobs/notional" "go.uber.org/zap" ) type exitCode int func main() { defer handleExit() context := context.Background() // get the config cfg, errConf := config.New(context) if errConf != nil { log.Fatal("error creating config", errConf) } logger := logger.New("wormhole-explorer-jobs", logger.WithLevel(cfg.LogLevel)) logger.Info("started job execution", zap.String("job_id", cfg.JobID)) var err error switch cfg.JobID { case jobs.JobIDNotional: notionalJob := initNotionalJob(context, cfg, logger) err = notionalJob.Run() default: logger.Fatal("Invalid job id", zap.String("job_id", cfg.JobID)) } if err != nil { logger.Error("failed job execution", zap.String("job_id", cfg.JobID), zap.Error(err)) } else { logger.Info("finish job execution successfully", zap.String("job_id", cfg.JobID)) } } // initNotionalJob initializes notional job. func initNotionalJob(ctx context.Context, cfg *config.Configuration, logger *zap.Logger) *notional.NotionalJob { // init coingecko api client. api := coingecko.NewCoingeckoAPI(cfg.CoingeckoURL) // init redis client. redisClient := redis.NewClient(&redis.Options{Addr: cfg.CacheURL}) // create notional job. notionalJob := notional.NewNotionalJob(api, redisClient, cfg.CachePrefix, cfg.P2pNetwork, cfg.NotionalChannel, logger) return notionalJob } func handleExit() { if r := recover(); r != nil { if e, ok := r.(exitCode); ok { os.Exit(int(e)) } panic(r) // not an Exit, bubble up } }