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);
            }
        }
Exemple #3
0
        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
                    });
                }