protected override Task <int> OnExecute(CommandLineApplication app) { var engineConfiguration = TryGetEngineConfigurationOrTerminate(_repositoryPathOption.Value()); var buildConfiguration = TryGetBuildConfigurationOrTerminate(engineConfiguration.RepositoryDirectoryPath); var engine = new Engine.Engine( engineConfiguration, buildConfiguration); engine.JobStarting += (sender, args) => { Outputter.Write($"Starting '{args.Job.Name}'..."); }; engine.JobEnded += (sender, args) => { switch (args.ExecutionResult.ResultType) { case JobExecutionResultType.Success: Outputter.WriteSuccess($"Job '{args.Job.Name}' successfully executed."); break; case JobExecutionResultType.Failure: Outputter.WriteError($"Job '{args.Job.Name}' failed."); break; case JobExecutionResultType.NotExecuted: Outputter.WriteError($"Job '{args.Job.Name}' will not be executed."); break; case JobExecutionResultType.JobNotFound: Outputter.WriteError("Specified job index not found. Use 'jobs' command to list available jobs."); break; case JobExecutionResultType.SolutionFileNotFound: Outputter.WriteError("Solution was not found."); break; case JobExecutionResultType.UnhandledException: Outputter.WriteError($"Unhandled exception while executing '{args.Job.Name}': " + $"{args.ExecutionResult.UnhandledException.Message}"); break; default: throw new ArgumentOutOfRangeException(); } }; int[] jobs; try { jobs = _jobsIndexesOption .Values .Select(int.Parse) .ToArray(); } catch (Exception) { Outputter.WriteError("Job option receives a integer as input. Use 'jobs' command to list all available jobs."); return(Task.FromResult(1)); } var jobsResults = new List <JobExecutionResult>(); if (jobs.Length == 0) { jobsResults = engine.ExecuteAllJobs().ToList(); } else { foreach (var jobIndex in jobs) { jobsResults.Add(engine.ExecuteJob(jobIndex)); } } PrintFinalResults(jobsResults); return(Task.FromResult(0)); }