printer: rename methods to make it more readable

This commit is contained in:
Fatih Arslan 2015-10-25 18:10:34 +03:00
parent e947512362
commit ad50ec5933
3 changed files with 34 additions and 40 deletions

View File

@ -3,7 +3,6 @@ package printer
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"io"
"github.com/fatih/hcl/ast" "github.com/fatih/hcl/ast"
) )
@ -14,13 +13,14 @@ const (
tab = byte('\t') tab = byte('\t')
) )
func (p *printer) printNode(n ast.Node) []byte { // node
func (p *printer) output(n ast.Node) []byte {
var buf bytes.Buffer var buf bytes.Buffer
switch t := n.(type) { switch t := n.(type) {
case *ast.ObjectList: case *ast.ObjectList:
for i, item := range t.Items { for i, item := range t.Items {
buf.Write(p.printObjectItem(item)) buf.Write(p.objectItem(item))
if i != len(t.Items)-1 { if i != len(t.Items)-1 {
buf.Write([]byte{newline, newline}) buf.Write([]byte{newline, newline})
} }
@ -28,13 +28,13 @@ func (p *printer) printNode(n ast.Node) []byte {
case *ast.ObjectKey: case *ast.ObjectKey:
buf.WriteString(t.Token.Text) buf.WriteString(t.Token.Text)
case *ast.ObjectItem: case *ast.ObjectItem:
buf.Write(p.printObjectItem(t)) buf.Write(p.objectItem(t))
case *ast.LiteralType: case *ast.LiteralType:
buf.WriteString(t.Token.Text) buf.WriteString(t.Token.Text)
case *ast.ListType: case *ast.ListType:
buf.Write(p.printList(t)) buf.Write(p.list(t))
case *ast.ObjectType: case *ast.ObjectType:
buf.Write(p.printObjectType(t)) buf.Write(p.objectType(t))
default: default:
fmt.Printf(" unknown type: %T\n", n) fmt.Printf(" unknown type: %T\n", n)
} }
@ -42,7 +42,7 @@ func (p *printer) printNode(n ast.Node) []byte {
return buf.Bytes() return buf.Bytes()
} }
func (p *printer) printObjectItem(o *ast.ObjectItem) []byte { func (p *printer) objectItem(o *ast.ObjectItem) []byte {
var buf bytes.Buffer var buf bytes.Buffer
for i, k := range o.Keys { for i, k := range o.Keys {
@ -56,21 +56,21 @@ func (p *printer) printObjectItem(o *ast.ObjectItem) []byte {
} }
} }
buf.Write(p.printNode(o.Val)) buf.Write(p.output(o.Val))
return buf.Bytes() return buf.Bytes()
} }
func (p *printer) printLiteral(l *ast.LiteralType) []byte { func (p *printer) literal(l *ast.LiteralType) []byte {
return []byte(l.Token.Text) return []byte(l.Token.Text)
} }
func (p *printer) printObjectType(o *ast.ObjectType) []byte { func (p *printer) objectType(o *ast.ObjectType) []byte {
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString("{") buf.WriteString("{")
buf.WriteByte(newline) buf.WriteByte(newline)
for _, item := range o.List.Items { for _, item := range o.List.Items {
buf.Write(p.indent(p.printObjectItem(item))) buf.Write(p.indent(p.objectItem(item)))
buf.WriteByte(newline) buf.WriteByte(newline)
} }
@ -78,7 +78,8 @@ func (p *printer) printObjectType(o *ast.ObjectType) []byte {
return buf.Bytes() return buf.Bytes()
} }
func (p *printer) printList(l *ast.ListType) []byte { // printList prints a HCL list
func (p *printer) list(l *ast.ListType) []byte {
var buf bytes.Buffer var buf bytes.Buffer
buf.WriteString("[") buf.WriteString("[")
@ -88,8 +89,7 @@ func (p *printer) printList(l *ast.ListType) []byte {
buf.WriteByte(newline) buf.WriteByte(newline)
} }
buf.WriteByte(tab) buf.Write(p.indent(p.output(item)))
buf.Write(p.printNode(item))
if i != len(l.List)-1 { if i != len(l.List)-1 {
buf.WriteString(",") buf.WriteString(",")
@ -104,18 +104,15 @@ func (p *printer) printList(l *ast.ListType) []byte {
return buf.Bytes() return buf.Bytes()
} }
func writeBlank(buf io.ByteWriter, indent int) { // indent indents the lines of the given buffer for each non-empty line
for i := 0; i < indent; i++ {
buf.WriteByte(blank)
}
}
func (p *printer) indent(buf []byte) []byte { func (p *printer) indent(buf []byte) []byte {
prefix := []byte{tab} var prefix []byte
if p.cfg.SpaceWidth != 0 { if p.cfg.SpacesWidth != 0 {
for i := 0; i < p.cfg.SpaceWidth; i++ { for i := 0; i < p.cfg.SpacesWidth; i++ {
prefix = append(prefix, blank) prefix = append(prefix, blank)
} }
} else {
prefix = []byte{tab}
} }
var res []byte var res []byte

View File

@ -8,27 +8,20 @@ import (
) )
type printer struct { type printer struct {
out []byte // raw printer result cfg Config
cfg Config
node ast.Node
}
func (p *printer) output() []byte {
return p.printNode(p.node)
} }
// A Config node controls the output of Fprint. // A Config node controls the output of Fprint.
type Config struct { type Config struct {
SpaceWidth int // if set, it will use spaces instead of tabs for alignment SpacesWidth int // if set, it will use spaces instead of tabs for alignment
} }
func (c *Config) fprint(output io.Writer, node ast.Node) error { func (c *Config) Fprint(output io.Writer, node ast.Node) error {
p := &printer{ p := &printer{
cfg: *c, cfg: *c,
node: node,
} }
if _, err := output.Write(p.output()); err != nil { if _, err := output.Write(p.output(node)); err != nil {
return err return err
} }
@ -41,10 +34,6 @@ func (c *Config) fprint(output io.Writer, node ast.Node) error {
return err return err
} }
func (c *Config) Fprint(output io.Writer, node ast.Node) error {
return c.fprint(output, node)
}
// Fprint "pretty-prints" an HCL node to output // Fprint "pretty-prints" an HCL node to output
// It calls Config.Fprint with default settings. // It calls Config.Fprint with default settings.
func Fprint(output io.Writer, node ast.Node) error { func Fprint(output io.Writer, node ast.Node) error {

View File

@ -113,7 +113,15 @@ func format(src []byte) ([]byte, error) {
} }
var buf bytes.Buffer var buf bytes.Buffer
if err := Fprint(&buf, node); err != nil {
// test with Spaces
// cfg := &Config{SpacesWidth: 4}
// if err := cfg.Fprint(&buf, node); err != nil {
// return nil, fmt.Errorf("print: %s", err)
// }
cfg := &Config{}
if err := cfg.Fprint(&buf, node); err != nil {
return nil, fmt.Errorf("print: %s", err) return nil, fmt.Errorf("print: %s", err)
} }