in terraformutils/hcl.go [97:161]
func (v *astSanitizer) visitObjectItem(o *ast.ObjectItem) {
for i, k := range o.Keys {
if i == 0 {
text := k.Token.Text
if text != "" && text[0] == '"' && text[len(text)-1] == '"' {
v := text[1 : len(text)-1]
safe := true
for _, c := range v {
if !strings.ContainsRune(safeChars, c) {
safe = false
break
}
}
if strings.HasPrefix(v, "--") { // if the key starts with "--", we must quote it. Seen in aws_glue_job.default_arguments parameter
v = fmt.Sprintf(`"%s"`, v)
}
if safe {
k.Token.Text = v
}
}
}
}
switch t := o.Val.(type) {
case *ast.LiteralType: // heredoc support
if strings.HasPrefix(t.Token.Text, `"<<`) {
t.Token.Text = t.Token.Text[1:]
t.Token.Text = t.Token.Text[:len(t.Token.Text)-1]
t.Token.Text = strings.ReplaceAll(t.Token.Text, `\n`, "\n")
t.Token.Text = strings.ReplaceAll(t.Token.Text, `\t`, "")
t.Token.Type = 10
// check if text json for Unquote and Indent
jsonTest := t.Token.Text
lines := strings.Split(jsonTest, "\n")
jsonTest = strings.Join(lines[1:len(lines)-1], "\n")
jsonTest = strings.ReplaceAll(jsonTest, "\\\"", "\"")
// it's json we convert to heredoc back
var tmp interface{} = map[string]interface{}{}
err := json.Unmarshal([]byte(jsonTest), &tmp)
if err != nil {
tmp = make([]interface{}, 0)
err = json.Unmarshal([]byte(jsonTest), &tmp)
}
if err == nil {
dataJSONBytes, err := json.MarshalIndent(tmp, "", " ")
if err == nil {
jsonData := strings.Split(string(dataJSONBytes), "\n")
// first line for heredoc
jsonData = append([]string{lines[0]}, jsonData...)
// last line for heredoc
jsonData = append(jsonData, lines[len(lines)-1])
hereDoc := strings.Join(jsonData, "\n")
t.Token.Text = hereDoc
}
}
}
case *ast.ListType:
sortHclTree(t.List)
default:
}
// A hack so that Assign.IsValid is true, so that the printer will output =
o.Assign.Line = 1
v.visit(o.Val)
}