| 181 | } |
| 182 | |
| 183 | func (m *module) provide(p provide) { |
| 184 | if m.app.err != nil { |
| 185 | return |
| 186 | } |
| 187 | |
| 188 | if p.IsSupply { |
| 189 | m.supply(p) |
| 190 | return |
| 191 | } |
| 192 | |
| 193 | funcName := fxreflect.FuncName(p.Target) |
| 194 | var info dig.ProvideInfo |
| 195 | opts := []dig.ProvideOption{ |
| 196 | dig.FillProvideInfo(&info), |
| 197 | dig.Export(!p.Private), |
| 198 | dig.WithProviderBeforeCallback(func(bci dig.BeforeCallbackInfo) { |
| 199 | m.log.LogEvent(&fxevent.BeforeRun{ |
| 200 | Name: funcName, |
| 201 | Kind: "provide", |
| 202 | ModuleName: m.name, |
| 203 | }) |
| 204 | }), |
| 205 | dig.WithProviderCallback(func(ci dig.CallbackInfo) { |
| 206 | m.log.LogEvent(&fxevent.Run{ |
| 207 | Name: funcName, |
| 208 | Kind: "provide", |
| 209 | ModuleName: m.name, |
| 210 | Runtime: ci.Runtime, |
| 211 | Err: ci.Error, |
| 212 | }) |
| 213 | }), |
| 214 | } |
| 215 | |
| 216 | if err := runProvide(m.scope, p, opts...); err != nil { |
| 217 | m.app.err = err |
| 218 | } |
| 219 | outputNames := make([]string, len(info.Outputs)) |
| 220 | for i, o := range info.Outputs { |
| 221 | outputNames[i] = o.String() |
| 222 | } |
| 223 | |
| 224 | m.log.LogEvent(&fxevent.Provided{ |
| 225 | ConstructorName: funcName, |
| 226 | StackTrace: p.Stack.Strings(), |
| 227 | ModuleTrace: append([]string{p.Stack[0].String()}, m.trace...), |
| 228 | ModuleName: m.name, |
| 229 | OutputTypeNames: outputNames, |
| 230 | Err: m.app.err, |
| 231 | Private: p.Private, |
| 232 | }) |
| 233 | } |
| 234 | |
| 235 | func (m *module) supply(p provide) { |
| 236 | typeName := p.SupplyType.String() |