internal Template ProcessResourcesAndOutputs()

in src/Analyzer.TemplateProcessor/ArmTemplateProcessor.cs [161:204]


        internal Template ProcessResourcesAndOutputs(Template template)
        {
            var evaluationHelper = GetTemplateFunctionEvaluationHelper(template);
            SaveFlattenedResources(template.Resources);

            foreach ((var resourceNameAndType, var resourceInfo) in flattenedResources)
            {
                ProcessTemplateResourceLanguageExpressions(resourceInfo.resource, evaluationHelper);

                CopyResourceDependants(resourceInfo.resource);

                if (!ResourceMappings.ContainsKey(resourceInfo.resource.Path))
                {
                    AddResourceMapping(resourceInfo.expandedPath, resourceInfo.resource.Path);
                }

                resourceInfo.resource.Type.Value = resourceNameAndType.Split(" ")[1];
            }

            if ((template.Outputs?.Count ?? 0) > 0)
            {
                // Recreate evaluation helper with newly parsed properties
                evaluationHelper = GetTemplateFunctionEvaluationHelper(template);

                foreach (var outputKey in template.Outputs.Keys.ToList())
                {
                    try
                    {
                        template.Outputs[outputKey].Value.Value = ExpressionsEngine.EvaluateLanguageExpressionsRecursive(
                            root: template.Outputs[outputKey].Value.Value,
                            evaluationContext: evaluationHelper.EvaluationContext);
                    }
                    catch (Exception)
                    {
                        logger?.LogWarning("The parsing of the template output named {outputName} failed", outputKey);
                        logger?.LogDebug("Output value: {outputValue}", template.Outputs[outputKey]?.Value?.Value?.ToString());

                        template.Outputs[outputKey].Value.Value = new JValue("NOT_PARSED");
                    }
                }
            }

            return template;
        }