switch module instances to map on id

This commit is contained in:
Joel Wetzell
2026-02-05 20:02:03 -06:00
parent 1e872ba0b9
commit b095419b6e

View File

@@ -18,14 +18,15 @@ import (
type Router struct { type Router struct {
contextCancel context.CancelFunc contextCancel context.CancelFunc
Context context.Context Context context.Context
// TODO(jwetzell): change to map for faster lookup ModuleInstances map[string]module.Module
ModuleInstances []module.Module // TODO(jwetzell): change to something easier to lookup
RouteInstances []route.Route RouteInstances []route.Route
moduleWait sync.WaitGroup moduleWait sync.WaitGroup
logger *slog.Logger logger *slog.Logger
tracer trace.Tracer tracer trace.Tracer
} }
// TODO(jwetzell): support removing module
func (r *Router) addModule(moduleDecl config.ModuleConfig) error { func (r *Router) addModule(moduleDecl config.ModuleConfig) error {
if moduleDecl.Id == "" { if moduleDecl.Id == "" {
return errors.New("module id cannot be empty") return errors.New("module id cannot be empty")
@@ -35,25 +36,21 @@ func (r *Router) addModule(moduleDecl config.ModuleConfig) error {
return errors.New("module type not defined") return errors.New("module type not defined")
} }
moduleInstanceExists := false _, ok = r.ModuleInstances[moduleDecl.Id]
for _, moduleInstance := range r.ModuleInstances { if ok {
if moduleInstance.Id() == moduleDecl.Id { return errors.New("module id already exists")
moduleInstanceExists = true
return errors.New("duplicate module id")
}
} }
if !moduleInstanceExists {
moduleInstance, err := moduleInfo.New(moduleDecl) moduleInstance, err := moduleInfo.New(moduleDecl)
if err != nil { if err != nil {
return err return err
} }
r.ModuleInstances = append(r.ModuleInstances, moduleInstance) r.ModuleInstances[moduleDecl.Id] = moduleInstance
}
return nil return nil
} }
// TODO(jwetzell): support removing route
func (r *Router) addRoute(routeDecl config.RouteConfig) error { func (r *Router) addRoute(routeDecl config.RouteConfig) error {
routeInstance, err := route.NewRoute(routeDecl) routeInstance, err := route.NewRoute(routeDecl)
if err != nil { if err != nil {
@@ -64,18 +61,17 @@ func (r *Router) addRoute(routeDecl config.RouteConfig) error {
} }
func (r *Router) getModule(moduleId string) module.Module { func (r *Router) getModule(moduleId string) module.Module {
for _, moduleInstance := range r.ModuleInstances { moduleInstance, ok := r.ModuleInstances[moduleId]
if moduleInstance.Id() == moduleId { if !ok {
return moduleInstance
}
}
return nil return nil
}
return moduleInstance
} }
func NewRouter(config config.Config, tracer trace.Tracer) (*Router, []module.ModuleError, []route.RouteError) { func NewRouter(config config.Config, tracer trace.Tracer) (*Router, []module.ModuleError, []route.RouteError) {
router := Router{ router := Router{
ModuleInstances: []module.Module{}, ModuleInstances: make(map[string]module.Module),
RouteInstances: []route.Route{}, RouteInstances: []route.Route{},
logger: slog.Default().With("component", "router"), logger: slog.Default().With("component", "router"),
tracer: tracer, tracer: tracer,