github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/util/natives/templates/indent_writer.go (about)

     1  // Copyright Monax Industries Limited
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package templates
     5  
     6  import "io"
     7  
     8  const newLine = byte('\n')
     9  
    10  type indentWriter struct {
    11  	writer      io.Writer
    12  	indentLevel uint
    13  	indentBytes []byte
    14  	indent      bool
    15  }
    16  
    17  var _ io.Writer = (*indentWriter)(nil)
    18  
    19  // indentWriter indents all lines written to it with a specified indent string
    20  // indented the specified number of indents
    21  func NewIndentWriter(indentLevel uint, indentString string,
    22  	writer io.Writer) *indentWriter {
    23  	return &indentWriter{
    24  		writer:      writer,
    25  		indentLevel: indentLevel,
    26  		indentBytes: []byte(indentString),
    27  		indent:      true,
    28  	}
    29  }
    30  
    31  func (iw *indentWriter) Write(p []byte) (int, error) {
    32  	bs := make([]byte, 0, len(p))
    33  	for _, b := range p {
    34  		if iw.indent {
    35  			for i := uint(0); i < iw.indentLevel; i++ {
    36  				bs = append(bs, iw.indentBytes...)
    37  			}
    38  			iw.indent = false
    39  		}
    40  		if b == newLine {
    41  			iw.indent = true
    42  		}
    43  		bs = append(bs, b)
    44  	}
    45  	return iw.writer.Write(bs)
    46  }
    47  
    48  func (iw *indentWriter) SetIndent(level uint) {
    49  	iw.indentLevel = level
    50  }