support middleware cross referencing

This commit is contained in:
yusing
2025-01-09 05:15:18 +08:00
parent 642e6ebdc8
commit adb41a80c5
3 changed files with 33 additions and 7 deletions

View File

@@ -94,9 +94,9 @@ func (m *Middleware) finalize() {
}
func (m *Middleware) New(optsRaw OptionsRaw) (*Middleware, E.Error) {
if m.construct == nil {
if optsRaw != nil {
panic("bug: middleware already constructed")
if m.construct == nil { // likely a middleware from compose
if len(optsRaw) != 0 {
return nil, E.New("additional options not allowed for middleware ").Subject(m.name)
}
return m, nil
}

View File

@@ -61,17 +61,38 @@ func LoadComposeFiles() {
logger.Err(err).Msg("failed to list middleware definitions")
return
}
for _, defFile := range middlewareDefs {
voidErrs := E.NewBuilder("") // ignore these errors, will be added in next step
mws := BuildMiddlewaresFromComposeFile(defFile, voidErrs)
if len(mws) == 0 {
continue
}
for name, m := range mws {
name = strutils.ToLowerNoSnake(name)
if _, ok := allMiddlewares[name]; ok {
errs.Add(ErrDuplicatedMiddleware.Subject(name))
continue
}
allMiddlewares[name] = m
logger.Info().
Str("src", path.Base(defFile)).
Str("name", name).
Msg("middleware loaded")
}
}
// build again to resolve cross references
for _, defFile := range middlewareDefs {
mws := BuildMiddlewaresFromComposeFile(defFile, errs)
if len(mws) == 0 {
continue
}
for name, m := range mws {
name = strutils.ToLowerNoSnake(name)
if _, ok := allMiddlewares[name]; ok {
errs.Add(ErrDuplicatedMiddleware.Subject(name))
// already loaded above
continue
}
allMiddlewares[strutils.ToLowerNoSnake(name)] = m
allMiddlewares[name] = m
logger.Info().
Str("src", path.Base(defFile)).
Str("name", name).