github.com/adwpc/xmobile@v0.0.0-20231212131043-3f9720cf0e99/bind/printer.go (about)

     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  
     5  package bind
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  )
    11  
    12  type Printer struct {
    13  	Buf        *bytes.Buffer
    14  	IndentEach []byte
    15  	indentText []byte
    16  	needIndent bool
    17  }
    18  
    19  func (p *Printer) writeIndent() error {
    20  	if !p.needIndent {
    21  		return nil
    22  	}
    23  	p.needIndent = false
    24  	_, err := p.Buf.Write(p.indentText)
    25  	return err
    26  }
    27  
    28  func (p *Printer) Write(b []byte) (n int, err error) {
    29  	wrote := 0
    30  	for len(b) > 0 {
    31  		if err := p.writeIndent(); err != nil {
    32  			return wrote, err
    33  		}
    34  		i := bytes.IndexByte(b, '\n')
    35  		if i < 0 {
    36  			break
    37  		}
    38  		n, err = p.Buf.Write(b[0 : i+1])
    39  		wrote += n
    40  		if err != nil {
    41  			return wrote, err
    42  		}
    43  		b = b[i+1:]
    44  		p.needIndent = true
    45  	}
    46  	if len(b) > 0 {
    47  		n, err = p.Buf.Write(b)
    48  		wrote += n
    49  	}
    50  	return wrote, err
    51  }
    52  
    53  func (p *Printer) Printf(format string, args ...interface{}) {
    54  	if _, err := fmt.Fprintf(p, format, args...); err != nil {
    55  		panic(fmt.Sprintf("printer: %v", err))
    56  	}
    57  }
    58  
    59  func (p *Printer) Indent() {
    60  	p.indentText = append(p.indentText, p.IndentEach...)
    61  }
    62  
    63  func (p *Printer) Outdent() {
    64  	if len(p.indentText) > len(p.IndentEach)-1 {
    65  		p.indentText = p.indentText[len(p.IndentEach):]
    66  	}
    67  }