Skip to content

Commit 16035fe

Browse files
authored
parse: fix format for multi error report (#24)
1 parent 7bc4df4 commit 16035fe

File tree

3 files changed

+28
-22
lines changed

3 files changed

+28
-22
lines changed

cmd/envsubst/main.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ func main() {
3434
fmt.Fprint(os.Stderr, fmt.Sprintf(usage))
3535
}
3636
flag.Parse()
37-
// Reader
3837
var reader *bufio.Reader
3938
if *input != "" {
4039
file, err := os.Open(*input)
@@ -50,7 +49,7 @@ func main() {
5049
}
5150
reader = bufio.NewReader(os.Stdin)
5251
}
53-
// Collect data
52+
// Collect input data.
5453
var data string
5554
for {
5655
line, err := reader.ReadString('\n')
@@ -63,9 +62,10 @@ func main() {
6362
}
6463
data += line
6564
}
66-
// Writer
67-
var file *os.File
68-
var err error
65+
var (
66+
err error
67+
file *os.File
68+
)
6969
if *output != "" {
7070
file, err = os.Create(*output)
7171
if err != nil {
@@ -80,9 +80,7 @@ func main() {
8080
parserMode = parse.Quick
8181
}
8282
restrictions := &parse.Restrictions{*noUnset, *noEmpty}
83-
84-
result, err := (*&parse.Parser{Name: "string", Env: os.Environ(), Restrict: restrictions, Mode: parserMode}).Parse(data)
85-
83+
result, err := (&parse.Parser{Name: "string", Env: os.Environ(), Restrict: restrictions, Mode: parserMode}).Parse(data)
8684
if err != nil {
8785
errorAndExit(err)
8886
}

parse/parse.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ package parse
33

44
import (
55
"errors"
6-
"fmt"
76
"strings"
87
)
98

9+
// A mode value is a set of flags (or 0). They control parser behavior.
1010
type Mode int
1111

12-
type Restrictions struct {
13-
NoUnset bool
14-
NoEmpty bool
15-
}
16-
1712
// Mode for parser behaviour
1813
const (
1914
Quick Mode = iota // stop parsing after first error encoutered and return
2015
AllErrors // report all errors
2116
)
2217

18+
// The restrictions option controls the parsring restriction.
19+
type Restrictions struct {
20+
NoUnset bool
21+
NoEmpty bool
22+
}
23+
2324
// Restrictions specifier
2425
var (
2526
Relaxed = &Restrictions{false, false}
@@ -54,33 +55,40 @@ func New(name string, env []string, r *Restrictions) *Parser {
5455
func (p *Parser) Parse(text string) (string, error) {
5556
p.lex = lex(text)
5657
// Build internal array of all unset or empty vars here
57-
var allErrors string
58+
var errs []error
5859
// clean parse state
5960
p.nodes = make([]Node, 0)
6061
p.peekCount = 0
6162
if err := p.parse(); err != nil {
62-
switch *&p.Mode {
63+
switch p.Mode {
6364
case Quick:
6465
return "", err
6566
case AllErrors:
66-
allErrors += fmt.Sprintf("%s\n", err.Error())
67+
errs = append(errs, err)
6768
}
6869
}
6970
var out string
7071
for _, node := range p.nodes {
7172
s, err := node.String()
7273
if err != nil {
73-
switch *&p.Mode {
74+
switch p.Mode {
7475
case Quick:
7576
return "", err
7677
case AllErrors:
77-
allErrors += fmt.Sprintf("%s\n", err.Error())
78+
errs = append(errs, err)
7879
}
7980
}
8081
out += s
8182
}
82-
if allErrors != "" {
83-
return "", fmt.Errorf("%s", allErrors)
83+
if len(errs) > 0 {
84+
var b strings.Builder
85+
for i, err := range errs {
86+
if i > 0 {
87+
b.WriteByte('\n')
88+
}
89+
b.WriteString(err.Error())
90+
}
91+
return "", errors.New(b.String())
8492
}
8593
return out, nil
8694
}

parse/parse_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ var parseTests = []parseTest{
109109
}
110110

111111
var negativeParseTests = []parseTest{
112-
{"$NOTSET and EMPTY are displayed as in full error output", "${NOTSET} and $EMPTY", "variable ${NOTSET} not set\nvariable ${EMPTY} set but empty\n", errAllFull},
112+
{"$NOTSET and EMPTY are displayed as in full error output", "${NOTSET} and $EMPTY", "variable ${NOTSET} not set\nvariable ${EMPTY} set but empty", errAllFull},
113113
}
114114

115115
func TestParse(t *testing.T) {

0 commit comments

Comments
 (0)