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.
This commit is contained in:
Özgür Kesim 2020-02-25 21:59:14 +01:00
parent 390017951e
commit e2c5841115
2 changed files with 8 additions and 2 deletions

View File

@ -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
})
}

View File

@ -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)
})