func convertARMTemplate()

in internal/langserver/handlers/command/arm_template_converter.go [74:137]


func convertARMTemplate(ctx context.Context, input string, telemetrySender telemetry.Sender) (string, error) {
	var model ARMTemplateModel
	err := json.Unmarshal([]byte(input), &model)
	if err != nil {
		return "", err
	}

	c := NewContext()

	for key, parameter := range model.Parameters {
		varBlock := hclwrite.NewBlock("variable", []string{key})
		switch strings.ToLower(parameter.Type) {
		case "string":
			varBlock.Body().SetAttributeTraversal("type", hcl.Traversal{hcl.TraverseRoot{Name: "string"}})
		case "securestring":
			varBlock.Body().SetAttributeTraversal("type", hcl.Traversal{hcl.TraverseRoot{Name: "string"}})
			varBlock.Body().SetAttributeValue("sensitive", cty.True)
		default:
			// Todo: support other types
			varBlock.Body().SetAttributeTraversal("type", hcl.Traversal{hcl.TraverseRoot{Name: strings.ToLower(parameter.Type)}})
		}
		varBlock.Body().SetAttributeValue("default", cty.StringVal(parameter.DefaultValue))
		c.AppendBlock(varBlock)
	}

	typeSet := make(map[string]bool)
	for _, resource := range model.Resources {
		typeValue := ""
		if resource["type"] != nil {
			typeValue = resource["type"].(string)
		}
		if resource["apiVersion"] != nil {
			typeValue = fmt.Sprintf("%s@%s", typeValue, resource["apiVersion"].(string))
		}
		typeSet[typeValue] = true

		res := flattenARMExpression(resource)
		data, err := json.MarshalIndent(res, "", "  ")
		if err != nil {
			return "", fmt.Errorf("unable to marshal JSON content: %v", err)
		}
		resourceJson := string(data)
		resourceBlock, err := ParseResourceJson(resourceJson)
		if err != nil {
			return "", fmt.Errorf("unable to parse resource JSON content: %v", err)
		}
		if resourceBlock == nil {
			return "", fmt.Errorf("resource block is nil")
		}
		c.AppendBlock(resourceBlock)
	}

	types := make([]string, 0)
	for t := range typeSet {
		types = append(types, t)
	}
	telemetrySender.SendEvent(ctx, "ConvertJsonToAzapi", map[string]interface{}{
		"status": "completed",
		"kind":   "arm-template",
		"type":   strings.Join(types, ","),
	})

	return c.String(), nil
}