Skip to content

Commit 0ad8a04

Browse files
authored
refac: DRY up New, reuse *All methods, delete modules slice (#1258)
The pattern we appear to have for Fx operations (Provide, Invoke, etc.) take the form: func (*module) thing(t thing) func (m *module) thingAll() { // perform module-local version of operation for _, t := range m.things { m.thing(t) } // recurse into children for _, m := range m.modules { m.${operation}All() } } This means that the following two are equivalent: // 1 for _, m := range app.modules { m.thingAll() } // 2 app.root.thingAll() Except (2) is DRYer. This cleans up New by relying on root-level `*All` methods instead of manually iterating over modules. Making this change also highlighted that 'app.modules' only ever has one entry: the root module. So we can delete that field from App as well. Finally, this also renames: constructAllCustomLoggers -> installAllEventLoggers constructCustomLogger -> installEventLogger executeInvokes -> invokeAll executeInvoke -> invoke
1 parent 928af08 commit 0ad8a04

File tree

2 files changed

+14
-25
lines changed

2 files changed

+14
-25
lines changed

app.go

+6-16
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,6 @@ type App struct {
304304

305305
container *dig.Container
306306
root *module
307-
modules []*module
308307

309308
// Timeouts used
310309
startTimeout time.Duration
@@ -446,7 +445,6 @@ func New(opts ...Option) *App {
446445
log: logger,
447446
trace: []string{fxreflect.CallerStack(1, 2)[0].String()},
448447
}
449-
app.modules = append(app.modules, app.root)
450448

451449
for _, opt := range opts {
452450
opt.apply(app.root)
@@ -475,10 +473,7 @@ func New(opts ...Option) *App {
475473
}
476474

477475
app.container = dig.New(containerOptions...)
478-
479-
for _, m := range app.modules {
480-
m.build(app, app.container)
481-
}
476+
app.root.build(app, app.container)
482477

483478
// Provide Fx types first to increase the chance a custom logger
484479
// can be successfully built in the face of unrelated DI failure.
@@ -490,31 +485,26 @@ func New(opts ...Option) *App {
490485
})
491486
app.root.provide(provide{Target: app.shutdowner, Stack: frames})
492487
app.root.provide(provide{Target: app.dotGraph, Stack: frames})
488+
app.root.provideAll()
493489

494-
for _, m := range app.modules {
495-
m.provideAll()
496-
}
497-
498-
// Run decorators before executing any Invokes -- including the one
499-
// inside constructCustomLogger.
490+
// Run decorators before executing any Invokes
491+
// (including the ones inside installAllEventLoggers).
500492
app.err = multierr.Append(app.err, app.root.decorateAll())
501493

502494
// If you are thinking about returning here after provides: do not (just yet)!
503495
// If a custom logger was being used, we're still buffering messages.
504496
// We'll want to flush them to the logger.
505497

506498
// custom app logger will be initialized by the root module.
507-
for _, m := range app.modules {
508-
m.constructAllCustomLoggers()
509-
}
499+
app.root.installAllEventLoggers()
510500

511501
// This error might have come from the provide loop above. We've
512502
// already flushed to the custom logger, so we can return.
513503
if app.err != nil {
514504
return app
515505
}
516506

517-
if err := app.root.executeInvokes(); err != nil {
507+
if err := app.root.invokeAll(); err != nil {
518508
app.err = err
519509

520510
if dig.CanVisualizeError(err) {

module.go

+8-9
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,11 @@ func (m *module) supply(p provide) {
253253
}
254254

255255
// Constructs custom loggers for all modules in the tree
256-
func (m *module) constructAllCustomLoggers() {
256+
func (m *module) installAllEventLoggers() {
257257
if m.logConstructor != nil {
258258
if buffer, ok := m.log.(*logBuffer); ok {
259259
// default to parent's logger if custom logger constructor fails
260-
if err := m.constructCustomLogger(buffer); err != nil {
260+
if err := m.installEventLogger(buffer); err != nil {
261261
m.app.err = multierr.Append(m.app.err, err)
262262
m.log = m.fallbackLogger
263263
buffer.Connect(m.log)
@@ -269,12 +269,11 @@ func (m *module) constructAllCustomLoggers() {
269269
}
270270

271271
for _, mod := range m.modules {
272-
mod.constructAllCustomLoggers()
272+
mod.installAllEventLoggers()
273273
}
274274
}
275275

276-
// Mirroring the behavior of app.constructCustomLogger
277-
func (m *module) constructCustomLogger(buffer *logBuffer) (err error) {
276+
func (m *module) installEventLogger(buffer *logBuffer) (err error) {
278277
p := m.logConstructor
279278
fname := fxreflect.FuncName(p.Target)
280279
defer func() {
@@ -297,23 +296,23 @@ func (m *module) constructCustomLogger(buffer *logBuffer) (err error) {
297296
})
298297
}
299298

300-
func (m *module) executeInvokes() error {
299+
func (m *module) invokeAll() error {
301300
for _, m := range m.modules {
302-
if err := m.executeInvokes(); err != nil {
301+
if err := m.invokeAll(); err != nil {
303302
return err
304303
}
305304
}
306305

307306
for _, invoke := range m.invokes {
308-
if err := m.executeInvoke(invoke); err != nil {
307+
if err := m.invoke(invoke); err != nil {
309308
return err
310309
}
311310
}
312311

313312
return nil
314313
}
315314

316-
func (m *module) executeInvoke(i invoke) (err error) {
315+
func (m *module) invoke(i invoke) (err error) {
317316
fnName := fxreflect.FuncName(i.Target)
318317
m.log.LogEvent(&fxevent.Invoking{
319318
FunctionName: fnName,

0 commit comments

Comments
 (0)