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 (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Seq matches all of the given parsers in order and returns their result as .Child[n]
|
// 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
|
startpos := ps.Pos
|
||||||
|
|
||||||
var longestError Error
|
var longestError Error
|
||||||
|
expected := []string{}
|
||||||
for _, parser := range parserfied {
|
for _, parser := range parserfied {
|
||||||
parser(ps, node)
|
parser(ps, node)
|
||||||
if ps.Errored() {
|
if ps.Errored() {
|
||||||
if ps.Error.pos >= longestError.pos {
|
if ps.Error.pos >= longestError.pos {
|
||||||
longestError = ps.Error
|
longestError = ps.Error
|
||||||
|
expected = append(expected, ps.Error.expected)
|
||||||
}
|
}
|
||||||
if ps.Cut > startpos {
|
if ps.Cut > startpos {
|
||||||
break
|
break
|
||||||
@ -68,7 +71,10 @@ func Any(parsers ...Parserish) Parser {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ps.Error = longestError
|
ps.Error = Error{
|
||||||
|
pos: longestError.pos,
|
||||||
|
expected: strings.Join(expected, " or "),
|
||||||
|
}
|
||||||
ps.Pos = startpos
|
ps.Pos = startpos
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ func TestAny(t *testing.T) {
|
|||||||
Seq("hello", "world", "."),
|
Seq("hello", "world", "."),
|
||||||
Seq("hello", "brother"),
|
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, 11, p2.Error.Pos())
|
||||||
require.Equal(t, 0, p2.Pos)
|
require.Equal(t, 0, p2.Pos)
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user