load dependencies by name instead of reference
This commit is contained in:
23
lifecycle.go
23
lifecycle.go
@@ -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 {
|
||||||
|
|||||||
14
module.go
14
module.go
@@ -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
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user