summaryrefslogtreecommitdiff
path: root/vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go')
-rw-r--r--vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go b/vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go
new file mode 100644
index 0000000..410895c
--- /dev/null
+++ b/vendor/github.com/mmcloughlin/avo/internal/prnt/printer.go
@@ -0,0 +1,60 @@
+// Package prnt provides common functionality for code generators.
+package prnt
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "strings"
+)
+
+// Generator provides convenience methods for code generators. In particular it
+// provides fmt-like methods which print to an internal buffer. It also allows
+// any errors to be stored so they can be checked at the end, rather than having
+// error checks obscuring the code generation.
+type Generator struct {
+ buf bytes.Buffer
+ err error
+}
+
+// Raw provides direct access to the underlying output stream.
+func (g *Generator) Raw() io.Writer {
+ return &g.buf
+}
+
+// Printf prints to the internal buffer.
+func (g *Generator) Printf(format string, args ...interface{}) {
+ if g.err != nil {
+ return
+ }
+ _, err := fmt.Fprintf(&g.buf, format, args...)
+ g.AddError(err)
+}
+
+// NL prints a new line.
+func (g *Generator) NL() {
+ g.Printf("\n")
+}
+
+// Comment writes comment lines prefixed with "// ".
+func (g *Generator) Comment(lines ...string) {
+ for _, line := range lines {
+ line = strings.TrimSpace("// " + line)
+ g.Printf("%s\n", line)
+ }
+}
+
+// AddError records an error in code generation. The first non-nil error will
+// prevent printing operations from writing anything else, and the error will be
+// returned from Result().
+func (g *Generator) AddError(err error) {
+ if err != nil && g.err == nil {
+ g.err = err
+ }
+}
+
+// Result returns the printed bytes. If any error was recorded with AddError
+// during code generation, the first such error will be returned here.
+func (g *Generator) Result() ([]byte, error) {
+ return g.buf.Bytes(), g.err
+}