summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖzgür Kesim <oec@codeblau.de>2020-02-25 21:59:14 +0100
committerÖzgür Kesim <oec@codeblau.de>2020-02-25 21:59:14 +0100
commite2c58411159b77a6135be3731c4a174f01d9d7a5 (patch)
tree4c8797f8a5c99ce004671cc6725484db200e9c9c
parent390017951eb80a2e1b58dbf9217e464f76dd71b3 (diff)
Any(): print all possible values
When all of the parsers in Any() fail, instead of printing just the longest error, we print the list of all failed/expected values. The position of the error will still remain that of the longest one.
-rw-r--r--combinator.go8
-rw-r--r--combinator_test.go2
2 files changed, 8 insertions, 2 deletions
diff --git a/combinator.go b/combinator.go
index b6b888b..ea75589 100644
--- a/combinator.go
+++ b/combinator.go
@@ -2,6 +2,7 @@ package goparsify
import (
"bytes"
+ "strings"
)
// Seq matches all of the given parsers in order and returns their result as .Child[n]
@@ -51,11 +52,13 @@ func Any(parsers ...Parserish) Parser {
startpos := ps.Pos
var longestError Error
+ expected := []string{}
for _, parser := range parserfied {
parser(ps, node)
if ps.Errored() {
if ps.Error.pos >= longestError.pos {
longestError = ps.Error
+ expected = append(expected, ps.Error.expected)
}
if ps.Cut > startpos {
break
@@ -68,7 +71,10 @@ func Any(parsers ...Parserish) Parser {
return
}
- ps.Error = longestError
+ ps.Error = Error{
+ pos: longestError.pos,
+ expected: strings.Join(expected, " or "),
+ }
ps.Pos = startpos
})
}
diff --git a/combinator_test.go b/combinator_test.go
index 40e2492..7b1be68 100644
--- a/combinator_test.go
+++ b/combinator_test.go
@@ -53,7 +53,7 @@ func TestAny(t *testing.T) {
Seq("hello", "world", "."),
Seq("hello", "brother"),
))
- require.Equal(t, "offset 11: expected .", p2.Error.Error())
+ require.Equal(t, "offset 11: expected nope or .", p2.Error.Error())
require.Equal(t, 11, p2.Error.Pos())
require.Equal(t, 0, p2.Pos)
})