private static async Task RunGeneratorAsync()
        {
            try
            {
                var version = await RetrieveRmVersion();

                if (options.TemplateStage == null)
                {
                    var releaseTemplateRepo = new RMReleaseTemplateRepository(options.ConnectionString, version);

                    var stages = await releaseTemplateRepo.GetReleaseTemplateStages(options.TemplateName);

                    if (!stages.Any())
                    {
                        throw new ArgumentException($@"The release template ""{options.TemplateName}"" has no stages. Check that the release template name is spelled correctly.", nameof(options.TemplateName));
                    }

                    foreach (var stage in stages)
                    {
                        await RetrieveWorkflowAndGenerateScript(version, options.TemplateName, stage);
                    }
                }
                else
                {
                    await RetrieveWorkflowAndGenerateScript(version, options.TemplateName, options.TemplateStage);
                }
            }
            catch (AggregateException ae)
            {
                ae.Handle(x =>
                {
                    if (x is SqlException) // This we know how to handle.
                    {
                        Console.WriteLine($"{Environment.NewLine}Cannot connect to the DB '{0}' on the SQL server '{1}'{Environment.NewLine}", options.DatabaseName, options.SqlServerName); return(true);
                    }

                    Console.WriteLine($"{Environment.NewLine}Unexpected error in processing '{0}'{Environment.NewLine}", x.Message);
                    return(false);
                });
            }
            // ReSharper disable once CatchAllClause
            catch (Exception ex)
            {
                // final global catch
                Console.WriteLine("A critical error occurred:");
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
        private static async Task <RMDeploymentSequence> RetrieveWorkflow(RMVersion version)
        {
            var repository = new RMReleaseTemplateRepository(
                options.ConnectionString,
                options.TemplateName,
                options.TemplateStage,
                version);

            PrintOnlyIfVerbose($"{Environment.NewLine}Connecting to the DB '{options.DatabaseName}' on the SQL server '{options.SqlServerName}'");

            // get the workflow
            var workflow = await repository.GetDeploymentSequence();

            return(workflow);
        }
        private static async Task<RMDeploymentSequence> RetrieveWorkflow(RMVersion version)
        {
            var repository = new RMReleaseTemplateRepository(
                options.ConnectionString,
                options.TemplateName,
                options.TemplateStage,
                version);

            PrintOnlyIfVerbose($"{Environment.NewLine}Connecting to the DB '{options.DatabaseName}' on the SQL server '{options.SqlServerName}'");

            // get the workflow
            var workflow = await repository.GetDeploymentSequence();
            return workflow;
        }