in codegen/post_gen_hooks.go [350:479]
func WorkflowMockGenHook(h *PackageHelper, t *Template) PostGenHook {
return func(instances map[string][]*ModuleInstance) error {
errChanSize := 0
shouldGenMap := map[*ModuleInstance][]*EndpointSpec{}
for _, instance := range instances["endpoint"] {
if instance.GeneratedSpec() == nil {
continue
}
endpointSpecs := instance.GeneratedSpec().([]*EndpointSpec)
for _, endpointSpec := range endpointSpecs {
if endpointSpec.WorkflowType == "custom" {
shouldGenMap[instance] = endpointSpecs
errChanSize += len(endpointSpecs)
break
}
}
}
genEndpointCount := len(shouldGenMap)
if genEndpointCount == 0 {
return nil
}
errChanSize += genEndpointCount
fmt.Printf("Generating %d endpoint mocks:\n", genEndpointCount)
ec := make(chan error, errChanSize)
var idx int32 = 1
var files sync.Map
var wg sync.WaitGroup
for instance, endpointSpecs := range shouldGenMap {
wg.Add(1)
go func(instance *ModuleInstance, endpointSpecs []*EndpointSpec) {
defer wg.Done()
buildDir := h.CodeGenTargetPath()
genDir := filepath.Join(buildDir, instance.Directory, "mock-workflow")
cwf, err := FindClientsWithFixture(instance)
if err != nil {
ec <- errors.Wrapf(
err,
"Error generating mock endpoint %s",
instance.InstanceName,
)
return
}
var subWg sync.WaitGroup
subWg.Add(1)
go func() {
defer subWg.Done()
mockClientsType, err := generateEndpointMockClientsType(instance, cwf, h, t)
if err != nil {
ec <- errors.Wrapf(
err,
"Error generating mock clients type.go for endpoint %s",
instance.InstanceName,
)
return
}
files.Store(filepath.Join(genDir, "type.go"), mockClientsType)
}()
for _, endpointSpec := range endpointSpecs {
if endpointSpec.WorkflowType != "custom" {
continue
}
subWg.Add(1)
go func(espec *EndpointSpec) {
defer subWg.Done()
mockWorkflow, err := generateMockWorkflow(espec, instance, cwf, h, t)
if err != nil {
ec <- errors.Wrapf(
err,
"Error generating mock workflow for %s",
instance.InstanceName,
)
return
}
filename := strings.ToLower(espec.ThriftServiceName) + "_" +
strings.ToLower(espec.ThriftMethodName) + "_workflow_mock.go"
files.Store(filepath.Join(genDir, filename), mockWorkflow)
}(endpointSpec)
}
subWg.Wait()
PrintGenLine(
"mock",
instance.ClassName,
instance.InstanceName,
path.Join(path.Base(buildDir), instance.Directory, "mock-workflow"),
int(atomic.LoadInt32(&idx)), genEndpointCount,
)
atomic.AddInt32(&idx, 1)
}(instance, endpointSpecs)
}
wg.Wait()
select {
case err := <-ec:
close(ec)
errs := []string{err.Error()}
for e := range ec {
errs = append(errs, e.Error())
}
return errors.Errorf(
"encountered %d errors when generating mock endpoint workflows:\n%s",
len(errs),
strings.Join(errs, "\n"),
)
default:
}
var err error
files.Range(func(p, data interface{}) bool {
if err = WriteAndFormat(p.(string), data.([]byte)); err != nil {
return false
}
return true
})
return err
}
}