package dynamic import "bytes" type indentBuffer struct { bytes.Buffer indent string indentCount int comma bool } func (b *indentBuffer) start() error { if b.indentCount >= 0 { b.indentCount++ return b.newLine(false) } return nil } func (b *indentBuffer) sep() error { if b.indentCount >= 0 { _, err := b.WriteString(": ") return err } else { return b.WriteByte(':') } } func (b *indentBuffer) end() error { if b.indentCount >= 0 { b.indentCount-- return b.newLine(false) } return nil } func (b *indentBuffer) maybeNext(first *bool) error { if *first { *first = false return nil } else { return b.next() } } func (b *indentBuffer) next() error { if b.indentCount >= 0 { return b.newLine(b.comma) } else if b.comma { return b.WriteByte(',') } else { return b.WriteByte(' ') } } func (b *indentBuffer) newLine(comma bool) error { if comma { err := b.WriteByte(',') if err != nil { return err } } err := b.WriteByte('\n') if err != nil { return err } for i := 0; i < b.indentCount; i++ { _, err := b.WriteString(b.indent) if err != nil { return err } } return nil }