printer.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package bind
  5. import (
  6. "bytes"
  7. "fmt"
  8. )
  9. type Printer struct {
  10. Buf *bytes.Buffer
  11. IndentEach []byte
  12. indentText []byte
  13. needIndent bool
  14. }
  15. func (p *Printer) writeIndent() error {
  16. if !p.needIndent {
  17. return nil
  18. }
  19. p.needIndent = false
  20. _, err := p.Buf.Write(p.indentText)
  21. return err
  22. }
  23. func (p *Printer) Write(b []byte) (n int, err error) {
  24. wrote := 0
  25. for len(b) > 0 {
  26. if err := p.writeIndent(); err != nil {
  27. return wrote, err
  28. }
  29. i := bytes.IndexByte(b, '\n')
  30. if i < 0 {
  31. break
  32. }
  33. n, err = p.Buf.Write(b[0 : i+1])
  34. wrote += n
  35. if err != nil {
  36. return wrote, err
  37. }
  38. b = b[i+1:]
  39. p.needIndent = true
  40. }
  41. if len(b) > 0 {
  42. n, err = p.Buf.Write(b)
  43. wrote += n
  44. }
  45. return wrote, err
  46. }
  47. func (p *Printer) Printf(format string, args ...interface{}) {
  48. if _, err := fmt.Fprintf(p, format, args...); err != nil {
  49. panic(fmt.Sprintf("printer: %v", err))
  50. }
  51. }
  52. func (p *Printer) Indent() {
  53. p.indentText = append(p.indentText, p.IndentEach...)
  54. }
  55. func (p *Printer) Outdent() {
  56. if len(p.indentText) > len(p.IndentEach)-1 {
  57. p.indentText = p.indentText[len(p.IndentEach):]
  58. }
  59. }