66 "fmt"
77 "os"
88 "strings"
9+ "sync"
910
1011 "github.com/vektra/mockery/v3/config"
1112 "github.com/vektra/mockery/v3/internal"
@@ -161,7 +162,7 @@ func (i *InterfaceCollection) Append(ctx context.Context, iface *internal.Interf
161162}
162163
163164func (r * RootApp ) Run () error {
164- remoteTemplateCache := make ( map [ string ] * internal. RemoteTemplate )
165+ remoteTemplateCache := pkg . NewRemoteTemplateCache ( )
165166
166167 log , err := logging .GetLogger (* r .Config .LogLevel )
167168 if err != nil {
@@ -296,66 +297,20 @@ func (r *RootApp) Run() error {
296297 }
297298 }
298299
300+ var wg sync.WaitGroup
299301 for outFilePath , interfacesInFile := range mockFileToInterfaces {
300- fileLog := log .With ().Str ("file" , outFilePath ).Logger ()
301- fileCtx := fileLog .WithContext (ctx )
302+ wg .Add (1 )
303+ go func () {
304+ defer wg .Done ()
302305
303- fileLog .Debug ().Int ("interfaces-in-file-len" , len (interfacesInFile .interfaces )).Msgf ("%v" , interfacesInFile )
304-
305- packageConfig , err := r .Config .GetPackageConfig (fileCtx , interfacesInFile .srcPkgPath )
306- if err != nil {
307- return err
308- }
309- if err := packageConfig .Config .ParseTemplates (ctx , "" , "" , interfacesInFile .srcPkg ); err != nil {
310- return err
311- }
312-
313- generator , err := pkg .NewTemplateGenerator (
314- fileCtx ,
315- interfacesInFile .srcPkg ,
316- interfacesInFile .outFilePath .Parent (),
317- * packageConfig .Config .Template ,
318- * packageConfig .Config .TemplateSchema ,
319- * packageConfig .Config .RequireTemplateSchemaExists ,
320- remoteTemplateCache ,
321- pkg .Formatter (* r .Config .Formatter ),
322- packageConfig .Config ,
323- interfacesInFile .outPkgName ,
324- )
325- if err != nil {
326- return err
327- }
328- fileLog .Info ().Msg ("Executing template" )
329- templateBytes , err := generator .Generate (
330- fileCtx ,
331- interfacesInFile .interfaces ,
332- interfacesInFile .srcPkg .Name ,
333- interfacesInFile .srcPkg .PkgPath ,
334- )
335- if err != nil {
336- return err
337- }
338-
339- outFile := pathlib .NewPath (outFilePath )
340- if err := outFile .Parent ().MkdirAll (); err != nil {
341- log .Err (err ).Msg ("failed to mkdir parent directories of mock file" )
342- return stackerr .NewStackErr (err )
343- }
344- fileLog .Info ().Msg ("Writing template to file" )
345- outFileExists , err := outFile .Exists ()
346- if err != nil {
347- fileLog .Err (err ).Msg ("can't determine if outfile exists" )
348- return fmt .Errorf ("determining if outfile exists: %w" , err )
349- }
350- if outFileExists && ! * packageConfig .Config .ForceFileWrite {
351- fileLog .Error ().Bool ("force-file-write" , * packageConfig .Config .ForceFileWrite ).Msg ("output file exists, can't write mocks" )
352- return fmt .Errorf ("outfile exists" )
353- }
354-
355- if err := outFile .WriteFile (templateBytes ); err != nil {
356- return stackerr .NewStackErr (err )
357- }
306+ fileLog := log .With ().Str ("file" , outFilePath ).Logger ()
307+ err := r .generate (log .WithContext (ctx ), fileLog , outFilePath , interfacesInFile , remoteTemplateCache )
308+ if err != nil {
309+ fileLog .Err (err ).Msg ("error generating mocks" )
310+ }
311+ }()
358312 }
313+ wg .Wait ()
359314
360315 // The loop above could exit early, so sometimes warnings won't be shown
361316 // until other errors are fixed
@@ -375,3 +330,68 @@ func (r *RootApp) Run() error {
375330
376331 return nil
377332}
333+
334+ func (r * RootApp ) generate (
335+ ctx context.Context ,
336+ log zerolog.Logger ,
337+ outFilePath string ,
338+ interfacesInFile * InterfaceCollection ,
339+ remoteTemplateCache * pkg.RemoteTemplateCache ,
340+ ) error {
341+ log .Debug ().Int ("interfaces-in-file-len" , len (interfacesInFile .interfaces )).Msgf ("%v" , interfacesInFile )
342+
343+ packageConfig , err := r .Config .GetPackageConfig (ctx , interfacesInFile .srcPkgPath )
344+ if err != nil {
345+ return err
346+ }
347+ if err := packageConfig .Config .ParseTemplates (ctx , "" , "" , interfacesInFile .srcPkg ); err != nil {
348+ return err
349+ }
350+
351+ generator , err := pkg .NewTemplateGenerator (
352+ ctx ,
353+ interfacesInFile .srcPkg ,
354+ interfacesInFile .outFilePath .Parent (),
355+ * packageConfig .Config .Template ,
356+ * packageConfig .Config .TemplateSchema ,
357+ * packageConfig .Config .RequireTemplateSchemaExists ,
358+ remoteTemplateCache ,
359+ pkg .Formatter (* r .Config .Formatter ),
360+ packageConfig .Config ,
361+ interfacesInFile .outPkgName ,
362+ )
363+ if err != nil {
364+ return err
365+ }
366+ log .Info ().Msg ("Executing template" )
367+ templateBytes , err := generator .Generate (
368+ ctx ,
369+ interfacesInFile .interfaces ,
370+ interfacesInFile .srcPkg .Name ,
371+ interfacesInFile .srcPkg .PkgPath ,
372+ )
373+ if err != nil {
374+ return err
375+ }
376+
377+ outFile := pathlib .NewPath (outFilePath )
378+ if err := outFile .Parent ().MkdirAll (); err != nil {
379+ log .Err (err ).Msg ("failed to mkdir parent directories of mock file" )
380+ return stackerr .NewStackErr (err )
381+ }
382+ log .Info ().Msg ("Writing template to file" )
383+ outFileExists , err := outFile .Exists ()
384+ if err != nil {
385+ log .Err (err ).Msg ("can't determine if outfile exists" )
386+ return fmt .Errorf ("determining if outfile exists: %w" , err )
387+ }
388+ if outFileExists && ! * packageConfig .Config .ForceFileWrite {
389+ log .Error ().Bool ("force-file-write" , * packageConfig .Config .ForceFileWrite ).Msg ("output file exists, can't write mocks" )
390+ return fmt .Errorf ("outfile exists" )
391+ }
392+
393+ if err := outFile .WriteFile (templateBytes ); err != nil {
394+ return stackerr .NewStackErr (err )
395+ }
396+ return nil
397+ }
0 commit comments