public GenerationResults GenerateConfigurations() { var configGenerationPreferences = _preferencesManager.GetPreferenceInstance <ConfigurationGeneratorPreferences>(); //TODO - To API: Template Load stuff? ITemplate template; TryCreateResult templateCreationResult = _templateFactory.TryCreateItem(configGenerationPreferences.TemplateFilePath, configGenerationPreferences.TemplateFileType, out template); using (template) { switch (templateCreationResult) { case TryCreateResult.FileNotFound: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.TemplateFileNotFound, $"Specified template file not found: {configGenerationPreferences.TemplateFilePath}"))); case TryCreateResult.FailedByExtension: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.TemplateTypeResolutionFailure, $"Failed to resolve template type from file extension: {configGenerationPreferences.TemplateFilePath.GetFileExtension()}"))); case TryCreateResult.FailedByType: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.UnknownTemplateType, $"Unknown template type: {configGenerationPreferences.TemplateFileType}"))); } //TODO - To API: Settings Load stuff? ISettingsLoader settingsLoader; TryCreateResult settingsLoaderCreationResult = _configurationCollectionLoaderFactory.TryCreateItem(configGenerationPreferences.SettingsFilePath, configGenerationPreferences.SettingsFileType, out settingsLoader); switch (settingsLoaderCreationResult) { case TryCreateResult.FileNotFound: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.SettingsFileNotFound, $"Specified settings file not found: {configGenerationPreferences.SettingsFilePath}"))); case TryCreateResult.FailedByExtension: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.SettingsLoaderTypeResolutionFailure, $"Failed to resolve settings loader type from file extension: {configGenerationPreferences.SettingsFilePath.GetFileExtension()}"))); case TryCreateResult.FailedByType: return(GenerationResults.CreateFail(new ConfigurationGeneratorError( ConfigurationGeneratorErrorCodes.UnknownSettingsLoaderType, $"Unknown settings loader type: {configGenerationPreferences.SettingsFileType}"))); } var result = settingsLoader.LoadSettings(configGenerationPreferences.SettingsFilePath); if (!result.Success) { return(GenerationResults.CreateFail(result.Error)); } IEnumerable <IDictionary <string, object> > loadedSettings = result.Value; var configurationCreationResult = _configurationFactory.CreateConfigurations(configGenerationPreferences, loadedSettings); if (!configurationCreationResult.Success) { return(GenerationResults.CreateFail(configurationCreationResult.Error)); } IEnumerable <IConfiguration> configurations = configurationCreationResult.Value; var configurationCollectionFilterPreferences = _preferencesManager.GetPreferenceInstance <ConfigurationCollectionFilterPreferences>(); var globallyUsedTokens = new HashSet <string>(); configurations = _configurationCollectionFilter.Filter( configurationCollectionFilterPreferences, configurations, token => globallyUsedTokens.Add(token)); //NOPUSH - duplicate will throw error? //TODO: make this pipeline async and parallelised //TODO: need to extract this out - or maybe move into the template itself (after all, this does represent a real template with its data) using (var templateStream = File.OpenRead(configGenerationPreferences.TemplateFilePath)) { var loadResults = template.Load(templateStream); if (!loadResults.Success) { return(GenerationResults.CreateFail(loadResults.TemplateLoadErrors)); } var singleFileGenerationResults = new List <SingleFileGenerationResult>(); foreach (var configuration in configurations) { SingleTemplateRenderResults renderResult = template.Render(configuration); if (renderResult.Errors.Any()) { singleFileGenerationResults.Add( new SingleFileGenerationResult( renderResult.Configuration, null, renderResult.Errors, false, false)); } else { renderResult = _postProcessorPipeline.PostProcessResult(renderResult); var writeResults = _fileOutputWriter.WriteOutput(renderResult); //TODO: clean this up - why is the errors collection in here? singleFileGenerationResults.Add( new SingleFileGenerationResult( renderResult.Configuration, writeResults.FullPath, renderResult.Errors, writeResults.FileChanged, writeResults.WasWritten)); } } return(GenerationResults.CreateSuccess(singleFileGenerationResults)); } } }