load dependencies by name instead of reference

This commit is contained in:
Elijah Duffy
2025-05-30 16:18:21 -07:00
parent 8d8c1e5672
commit fc41a6ee5b
2 changed files with 24 additions and 13 deletions

View File

@@ -163,13 +163,18 @@ func (app *Lifecycle) setupSingle(sub *Module, logger *slog.Logger) (bool, error
// Check if all dependencies are satisfied // Check if all dependencies are satisfied
for _, dep := range sub.depends { for _, dep := range sub.depends {
if _, ok := app.setupTracker[dep.name]; !ok { if _, ok := app.setupTracker[dep]; !ok {
if app.opts.DisableAutoload { if app.opts.DisableAutoload {
return false, fmt.Errorf("dependency '%s' not satisfied for '%s'", dep.name, sub.name) return false, fmt.Errorf("dependency '%s' not satisfied for '%s'", dep, sub.name)
} else { } else {
// Attempt to set up the dependency // Attempt to set up the dependency
if _, err := app.setupSingle(dep, logger); err != nil { mod, err := app.getModuleByName(dep)
return false, fmt.Errorf("error setting up dependency '%s' for '%s': %w", dep.name, sub.name, err) if err != nil {
return false, err
}
if _, err := app.setupSingle(mod, logger); err != nil {
return false, fmt.Errorf("error setting up dependency '%s' for '%s': %w", dep, sub.name, err)
} }
} }
@@ -213,6 +218,16 @@ func (app *Lifecycle) singleTeardown(sub *Module) (bool, error) {
return false, nil return false, nil
} }
// getModuleByName retrieves a module by its name from the lifecycle.
func (app *Lifecycle) getModuleByName(name string) (*Module, error) {
for _, sub := range app.modules {
if sub.name == name {
return sub, nil
}
}
return nil, fmt.Errorf("module '%s' not found", name)
}
// mapToString converts a map to an opinionated string representation. // mapToString converts a map to an opinionated string representation.
func mapToString(m map[string]bool) string { func mapToString(m map[string]bool) string {
if len(m) == 0 { if len(m) == 0 {

View File

@@ -12,7 +12,7 @@ type Module struct {
name string name string
setup setupFn setup setupFn
teardown teardownFn teardown teardownFn
depends []*Module depends []string
} }
// ModuleOpts contains user-exposed options when defining a module. // ModuleOpts contains user-exposed options when defining a module.
@@ -21,8 +21,9 @@ type ModuleOpts struct {
Setup setupFn Setup setupFn
// Teardown is the teardown function for the module. // Teardown is the teardown function for the module.
Teardown teardownFn Teardown teardownFn
// Depends is a list of modules that this module depends on. // Depends is a list of modules that this module depends on. Each entry must
Depends []*Module // be the exact name of a module registered in the lifecycle.
Depends []string
} }
// NewModule creates a new Module instance with the given name and options. // NewModule creates a new Module instance with the given name and options.
@@ -38,7 +39,7 @@ func NewModule(name string, opts ModuleOpts) *Module {
// Logger returns the logger for the module. // Logger returns the logger for the module.
func (s *Module) Logger() *slog.Logger { func (s *Module) Logger() *slog.Logger {
if s.logger == nil { if s.logger == nil {
panic(fmt.Sprintf("subsytem %s used before logger was initialized", s.name)) panic(fmt.Sprintf("module %s used before logger was initialized", s.name))
} }
return s.logger return s.logger
} }
@@ -47,8 +48,3 @@ func (s *Module) Logger() *slog.Logger {
func (s *Module) Name() string { func (s *Module) Name() string {
return s.name return s.name
} }
// ModuleList is a convenience function that creates a slice of modules.
func ModuleList(modules ...*Module) []*Module {
return modules
}