internal static string GeneratePlaceholderParameters()

in src/Analyzer.TemplateProcessor/PlaceholderInputGenerator.cs [25:126]


        internal static string GeneratePlaceholderParameters(string armTemplate, string definedParameters = null)
        {
            JObject jsonParameters = new JObject();

            if (definedParameters != null)
            {
                JObject definedParameterJson = JObject.Parse(definedParameters);
                if (definedParameterJson.InsensitiveToken("parameters") is JObject paramsObject)
                {
                    jsonParameters = paramsObject;
                }
                else
                {
                    throw new Exception("Parameters property is not specified in the ARM Template parameters provided. Please ensure ARM Template parameters follows the following JSON schema https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#");
                }
            }

            // parse only parameter data from the template to avoid additional overhead
            JToken parameters = null;

            var reader = new JsonTextReader(new StringReader(armTemplate));
            while (reader.Read())
            {
                if (reader.Depth == 1 && reader.TokenType == JsonToken.PropertyName)
                {
                    if (string.Equals((string)reader.Value, "parameters", StringComparison.OrdinalIgnoreCase))
                    {
                        reader.Read(); // read StartObjectToken
                        parameters = JToken.ReadFrom(reader);
                        break;
                    }
                }
            }

            if (parameters != null)
            {
                int count = 0;

                foreach (JProperty parameter in parameters.Children<JProperty>())
                {
                    JToken parameterValue = parameter.Value;
                    if (!jsonParameters.ContainsKey(parameter.Name) && parameterValue.InsensitiveToken("defaultValue") == null)
                    {
                        JToken allowedValues = parameterValue.InsensitiveToken("allowedValues");
                        if (allowedValues != null)
                        {
                            JToken firstAllowedValue = allowedValues.First;

                            if (firstAllowedValue != null)
                            {
                                jsonParameters[parameter.Name] = new JObject(new JProperty("value", firstAllowedValue));
                                continue;
                            }
                        }

                        string parameterTypeString = parameterValue.InsensitiveToken("type")?.Value<string>();
                        if (Enum.TryParse<TemplateParameterType>(parameterTypeString, ignoreCase: true, out var parameterType))
                        {
                            switch (parameterType)
                            {
                                case TemplateParameterType.String:
                                case TemplateParameterType.SecureString:
                                    string stringValue = "defaultString";
                                    int countLength = count.ToString().Length;
                                    int? minLength = parameterValue.InsensitiveToken("minLength")?.Value<int>();
                                    int? maxLength = parameterValue.InsensitiveToken("maxLength")?.Value<int>();
                                    if (minLength.HasValue && stringValue.Length + countLength < minLength)
                                    {
                                        stringValue += new string('a', minLength.Value - stringValue.Length - countLength);
                                    }
                                    else if (maxLength.HasValue && stringValue.Length + countLength > maxLength)
                                    {
                                        stringValue = stringValue[0..(maxLength.Value - countLength)];
                                    }
                                    stringValue += count.ToString();
                                    jsonParameters[parameter.Name] = new JObject(new JProperty("value", stringValue));
                                    break;
                                case TemplateParameterType.Int:
                                    jsonParameters[parameter.Name] = new JObject(new JProperty("value", 1));
                                    break;
                                case TemplateParameterType.Bool:
                                    jsonParameters[parameter.Name] = new JObject(new JProperty("value", true));
                                    break;
                                case TemplateParameterType.Array:
                                    jsonParameters[parameter.Name] = JObject.FromObject(new { value = new[] { "item1", "item2" } });
                                    break;
                                case TemplateParameterType.Object:
                                case TemplateParameterType.SecureObject:
                                    jsonParameters[parameter.Name] = JObject.FromObject(new { value = new { property1 = "value1" } });
                                    break;
                                default:
                                    break;
                            }
                        }
                    }

                    count++;
                }
            }

            return JObject.FromObject(new { parameters = jsonParameters }).ToString();
        }