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
}