package app import ( "fmt" "log/slog" ) // RequireOpts configures [Lifecycle.RequireWithOpts] behavior. type RequireOpts struct { // Logger overrides the lifecycle logger for the required modules. If nil, // the lifecycle logger is used. Logger *slog.Logger // Unique, when true, returns an error if any requested module name is // already set up instead of ignoring duplicate instances. Unique bool } // Require adds module(s) to the lifecycle and immediately runs setup. // Modules that are already set up (by name) are ignored. func (app *Lifecycle) Require(modules ...*Module) error { return app.require(RequireOpts{}, modules...) } // RequireWithOpts is like [Lifecycle.Require] with additional options. func (app *Lifecycle) RequireWithOpts(opts RequireOpts, modules ...*Module) error { return app.require(opts, modules...) } // GetModule returns a registered module by name. func (app *Lifecycle) GetModule(name string) (*Module, error) { mod, err := app.getModuleByName(name) if err != nil { return nil, fmt.Errorf("get module %q: %w", name, err) } return mod, nil } // RequireL loads modules using a specific logger. Deprecated: use // RequireWithOpts(RequireOpts{Logger: logger}, modules...). func (app *Lifecycle) RequireL(logger *slog.Logger, modules ...*Module) error { if logger == nil { return fmt.Errorf("logger cannot be nil") } return app.require(RequireOpts{Logger: logger}, modules...) } // RequireUnique loads modules and errors if any name is already set up. // Deprecated: use RequireWithOpts(RequireOpts{Unique: true}, modules...). func (app *Lifecycle) RequireUnique(modules ...*Module) error { return app.require(RequireOpts{Unique: true}, modules...) } // RequireUniqueL combines RequireL and RequireUnique. // Deprecated: use RequireWithOpts(RequireOpts{Logger: logger, Unique: true}, modules...). func (app *Lifecycle) RequireUniqueL(logger *slog.Logger, modules ...*Module) error { if logger == nil { return fmt.Errorf("logger cannot be nil") } return app.require(RequireOpts{Logger: logger, Unique: true}, modules...) }