17ff23300f
This completes the minimal functionality for creating a new file from scratch, rather than modifying an existing one. This is illustrated by a new test TestRoundupCreate that uses the API to create a new file in a similar way to how a calling application might.
122 lines
2.1 KiB
Go
122 lines
2.1 KiB
Go
package hclwrite
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
type File struct {
|
|
inTree
|
|
|
|
srcBytes []byte
|
|
body *node
|
|
}
|
|
|
|
// NewEmptyFile constructs a new file with no content, ready to be mutated
|
|
// by other calls that append to its body.
|
|
func NewEmptyFile() *File {
|
|
f := &File{
|
|
inTree: newInTree(),
|
|
}
|
|
body := newBody()
|
|
f.body = f.children.Append(body)
|
|
return f
|
|
}
|
|
|
|
// Body returns the root body of the file, which contains the top-level
|
|
// attributes and blocks.
|
|
func (f *File) Body() *Body {
|
|
return f.body.content.(*Body)
|
|
}
|
|
|
|
// WriteTo writes the tokens underlying the receiving file to the given writer.
|
|
//
|
|
// The tokens first have a simple formatting pass applied that adjusts only
|
|
// the spaces between them.
|
|
func (f *File) WriteTo(wr io.Writer) (int64, error) {
|
|
tokens := f.inTree.children.BuildTokens(nil)
|
|
format(tokens)
|
|
return tokens.WriteTo(wr)
|
|
}
|
|
|
|
// Bytes returns a buffer containing the source code resulting from the
|
|
// tokens underlying the receiving file. If any updates have been made via
|
|
// the AST API, these will be reflected in the result.
|
|
func (f *File) Bytes() []byte {
|
|
buf := &bytes.Buffer{}
|
|
f.WriteTo(buf)
|
|
return buf.Bytes()
|
|
}
|
|
|
|
type comments struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
tokens Tokens
|
|
}
|
|
|
|
func newComments(tokens Tokens) *comments {
|
|
return &comments{
|
|
tokens: tokens,
|
|
}
|
|
}
|
|
|
|
func (c *comments) BuildTokens(to Tokens) Tokens {
|
|
return c.tokens.BuildTokens(to)
|
|
}
|
|
|
|
type identifier struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
token *Token
|
|
}
|
|
|
|
func newIdentifier(token *Token) *identifier {
|
|
return &identifier{
|
|
token: token,
|
|
}
|
|
}
|
|
|
|
func (i *identifier) BuildTokens(to Tokens) Tokens {
|
|
return append(to, i.token)
|
|
}
|
|
|
|
func (i *identifier) hasName(name string) bool {
|
|
return name == string(i.token.Bytes)
|
|
}
|
|
|
|
type number struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
token *Token
|
|
}
|
|
|
|
func newNumber(token *Token) *number {
|
|
return &number{
|
|
token: token,
|
|
}
|
|
}
|
|
|
|
func (n *number) BuildTokens(to Tokens) Tokens {
|
|
return append(to, n.token)
|
|
}
|
|
|
|
type quoted struct {
|
|
leafNode
|
|
|
|
parent *node
|
|
tokens Tokens
|
|
}
|
|
|
|
func newQuoted(tokens Tokens) *quoted {
|
|
return "ed{
|
|
tokens: tokens,
|
|
}
|
|
}
|
|
|
|
func (q *quoted) BuildTokens(to Tokens) Tokens {
|
|
return q.tokens.BuildTokens(to)
|
|
}
|