private void GenerateCode(SourceGeneratorContext context) { foreach (CodeGenerationConfigBuilder builder in _config.Builders) { if (builder.Input == null || builder.Output == null) { _logger.LogError("Skipping generation", "Input or ouput object is not provided.", null); continue; } foreach (INamedItem @object in _renderEngine.GetMatchedObjects(context, _visitor, builder)) { RenderResultModel renderResult = _renderEngine.RenderMatch(@object, builder); if (renderResult != null) { _generationEngine.AddToCurrentGeneration(renderResult); } else { _logger.LogError("Skipping generation", "File failed to render.", null); continue; } } _generationEngine.PublishGeneration(context); } }
public RenderResultModel RenderMatch(INamedItem @object, CodeGenerationConfigBuilder builder) { Models.RenderModels.Object renderModel = RenderModel.FromNamedItem(builder, @object); var serialRenderModel = JSON.Convert(renderModel); _logger.LogError(new LogModel { Message = serialRenderModel, Title = renderModel?.ToString(), AdditionalKey = $"{renderModel?.ToString()}_{DateTime.Now:yyyy-MM-dd-HH-mm-ss}", Scopes = LogScope.Objects }); TemplateContext templateContext = new TemplateContext(); ScriptObject scriptObject = new ScriptObject(); scriptObject.Import(typeof(StringFunctions)); scriptObject.Import(renderModel); templateContext.PushGlobal(scriptObject); string templateContent = TemplateHelper.FindTemplateFile(builder.Input.Template); if (!string.IsNullOrEmpty(templateContent)) { Template template = Template.Parse(templateContent); List <Template> fileNameTemplates = new List <Template>(); if (builder.Output.OutputPathTemplates != null && builder.Output.OutputPathTemplates.Any()) { fileNameTemplates.AddRange(builder.Output.OutputPathTemplates.Select(t => Template.Parse(t))); } else { fileNameTemplates.Add(Template.Parse(builder.Output.OutputPathTemplate)); } string result = template.Render(templateContext); List <string> outputFilePaths = new List <string>(fileNameTemplates.Select(r => r.Render(templateContext))); RenderResultModel renderResult = new RenderResultModel { Result = result, BuilderConfig = builder, OutputPaths = outputFilePaths }; return(renderResult); } else { _logger.LogError("Error finding template", "Could not find the following template: " + builder.Input.Template); return(null); } }
public void AddToCurrentGeneration(RenderResultModel renderResult) { GenerationModel <RenderResultModel> newGeneration = new GenerationModel <RenderResultModel>(CurrentGeneration, renderResult); foreach (string fileName in renderResult.OutputPaths) { List <GenerationModel <RenderResultModel> > previousGens = _generations.ContainsKey(fileName) ? _generations[fileName] : null; if (previousGens is null || !previousGens.Any()) { _generations.Add(fileName, new List <GenerationModel <RenderResultModel> > { newGeneration }); }