| 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) |
| } |