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:
parent
390017951e
commit
e2c5841115
@ -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
|
||||
})
|
||||
}
|
||||
|
@ -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)
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user