package di import ( "context" "fmt" "os" configimpl "git.dcentral.systems/toolz/goplt/internal/config" loggerimpl "git.dcentral.systems/toolz/goplt/internal/logger" "git.dcentral.systems/toolz/goplt/pkg/config" "git.dcentral.systems/toolz/goplt/pkg/logger" "go.uber.org/fx" ) // ProvideConfig creates an FX option that provides ConfigProvider. func ProvideConfig() fx.Option { return fx.Provide(func() (config.ConfigProvider, error) { // Determine environment from environment variable or default to "development" env := os.Getenv("ENVIRONMENT") if env == "" { env = "development" } cfg, err := configimpl.LoadConfig(env) if err != nil { return nil, fmt.Errorf("failed to load config: %w", err) } return cfg, nil }) } // ProvideLogger creates an FX option that provides Logger. func ProvideLogger() fx.Option { return fx.Provide(func(cfg config.ConfigProvider) (logger.Logger, error) { level := cfg.GetString("logging.level") if level == "" { level = "info" } format := cfg.GetString("logging.format") if format == "" { format = "json" } log, err := loggerimpl.NewZapLogger(level, format) if err != nil { return nil, fmt.Errorf("failed to create logger: %w", err) } // Set as global logger logger.SetGlobalLogger(log) return log, nil }) } // CoreModule returns an FX option that provides all core services. // This includes configuration and logging. func CoreModule() fx.Option { return fx.Options( ProvideConfig(), ProvideLogger(), ) } // RegisterLifecycleHooks registers lifecycle hooks for logging. func RegisterLifecycleHooks(lc fx.Lifecycle, l logger.Logger) { lc.Append(fx.Hook{ OnStart: func(_ context.Context) error { l.Info("Application starting", logger.String("component", "bootstrap"), ) return nil }, OnStop: func(_ context.Context) error { l.Info("Application shutting down", logger.String("component", "bootstrap"), ) return nil }, }) }