@@ -33,6 +33,9 @@ func PopAttr(body *hclwrite.Body, attrName, errPrefix string) (hclwrite.Tokens,
3333
3434// GetAttrExpr returns the expression of an attribute as a string.
3535func GetAttrExpr (attr * hclwrite.Attribute ) string {
36+ if attr == nil {
37+ return ""
38+ }
3639 return strings .TrimSpace (string (attr .Expr ().BuildTokens (nil ).Bytes ()))
3740}
3841
@@ -77,6 +80,10 @@ func GetAttrString(attr *hclwrite.Attribute, errPrefix string) (string, error) {
7780 return val .AsString (), nil
7881}
7982
83+ func TokenNewLine () * hclwrite.Token {
84+ return & hclwrite.Token {Type : hclsyntax .TokenNewline , Bytes : []byte ("\n " )}
85+ }
86+
8087// TokensArray creates an array of objects.
8188func TokensArray (bodies []* hclwrite.Body ) hclwrite.Tokens {
8289 tokens := make ([]hclwrite.Tokens , 0 )
@@ -93,9 +100,9 @@ func TokensArraySingle(body *hclwrite.Body) hclwrite.Tokens {
93100
94101// TokensObject creates an object.
95102func TokensObject (body * hclwrite.Body ) hclwrite.Tokens {
96- tokens := hclwrite.Tokens {tokenNewLine }
103+ tokens := hclwrite.Tokens {TokenNewLine () }
97104 tokens = append (tokens , RemoveLeadingNewline (body .BuildTokens (nil ))... )
98- return EncloseBraces (tokens )
105+ return EncloseBraces (tokens , false )
99106}
100107
101108// TokensFromExpr creates the tokens for an expression provided as a string.
@@ -105,7 +112,7 @@ func TokensFromExpr(expr string) hclwrite.Tokens {
105112
106113// TokensObjectFromExpr creates an object with an expression.
107114func TokensObjectFromExpr (expr string ) hclwrite.Tokens {
108- return EncloseBraces (EncloseNewLines (TokensFromExpr (expr )))
115+ return EncloseBraces (EncloseNewLines (TokensFromExpr (expr )), false )
109116}
110117
111118// TokensFuncMerge creates the tokens for the HCL merge function.
@@ -115,6 +122,12 @@ func TokensFuncMerge(tokens ...hclwrite.Tokens) hclwrite.Tokens {
115122 return append (ret , EncloseParens (params )... )
116123}
117124
125+ // TokensFuncFlatten creates the tokens for the HCL flatten function.
126+ func TokensFuncFlatten (tokens hclwrite.Tokens ) hclwrite.Tokens {
127+ ret := TokensFromExpr ("flatten" )
128+ return append (ret , EncloseParens (EncloseBrackets (EncloseNewLines (tokens )))... )
129+ }
130+
118131// RemoveLeadingNewline removes the first newline if it exists to make the output prettier.
119132func RemoveLeadingNewline (tokens hclwrite.Tokens ) hclwrite.Tokens {
120133 if len (tokens ) > 0 && tokens [0 ].Type == hclsyntax .TokenNewline {
@@ -140,8 +153,6 @@ func GetParser(config []byte) (*hclwrite.File, error) {
140153 return parser , nil
141154}
142155
143- var tokenNewLine = & hclwrite.Token {Type : hclsyntax .TokenNewline , Bytes : []byte ("\n " )}
144-
145156// joinTokens joins multiple tokens with commas and newlines.
146157func joinTokens (tokens ... hclwrite.Tokens ) hclwrite.Tokens {
147158 ret := hclwrite.Tokens {}
@@ -150,7 +161,7 @@ func joinTokens(tokens ...hclwrite.Tokens) hclwrite.Tokens {
150161 if i < len (tokens )- 1 {
151162 ret = append (ret ,
152163 & hclwrite.Token {Type : hclsyntax .TokenComma , Bytes : []byte ("," )},
153- tokenNewLine )
164+ TokenNewLine () )
154165 }
155166 }
156167 return ret
@@ -164,8 +175,11 @@ func EncloseParens(tokens hclwrite.Tokens) hclwrite.Tokens {
164175}
165176
166177// EncloseBraces encloses tokens with curly braces, { }.
167- func EncloseBraces (tokens hclwrite.Tokens ) hclwrite.Tokens {
178+ func EncloseBraces (tokens hclwrite.Tokens , initialNewLine bool ) hclwrite.Tokens {
168179 ret := hclwrite.Tokens {{Type : hclsyntax .TokenOBrace , Bytes : []byte ("{" )}}
180+ if initialNewLine {
181+ ret = append (ret , TokenNewLine ())
182+ }
169183 ret = append (ret , tokens ... )
170184 return append (ret , & hclwrite.Token {Type : hclsyntax .TokenCBrace , Bytes : []byte ("}" )})
171185}
@@ -179,7 +193,7 @@ func EncloseBrackets(tokens hclwrite.Tokens) hclwrite.Tokens {
179193
180194// EncloseNewLines encloses tokens with newlines at the beginning and end.
181195func EncloseNewLines (tokens hclwrite.Tokens ) hclwrite.Tokens {
182- ret := hclwrite.Tokens {tokenNewLine }
196+ ret := hclwrite.Tokens {TokenNewLine () }
183197 ret = append (ret , tokens ... )
184- return append (ret , tokenNewLine )
198+ return append (ret , TokenNewLine () )
185199}
0 commit comments