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 }