func run()

in pkg/migrate/migrate.go [72:120]


func run(ctx context.Context, sem chan struct{}, t MethodType, migrators ...Migrator) error {
	var (
		errors  error
		wg      = sync.WaitGroup{}
		results = make(chan error, len(migrators))
	)

Loop:
	for _, m := range migrators {
		select {
		case <-ctx.Done():
			errors = multierr.Append(errors, fmt.Errorf("context closed during %T.%v: %w", m, t, ctx.Err()))
			break Loop
		case sem <- struct{}{}:
		}
		wg.Add(1)
		go func(m Migrator) {
			defer func() { <-sem }()
			defer wg.Done()
			var method func(ctx context.Context) error
			switch t {
			case CompleteMethod:
				method = m.Complete
			case ValidateMethod:
				method = m.Validate
			case MigrateMethod:
				method = m.Migrate
			default:
				log.Errorf("Invalid method %v", t)
				return
			}
			results <- method(ctx)
		}(m)
	}
	wg.Wait()
	close(results)

	if errors != nil {
		return errors
	}

	for err := range results {
		if err != nil {
			errors = multierr.Append(errors, err)
		}
	}

	return errors
}