Added MatchString

This commit is contained in:
2024-09-24 11:53:32 -06:00
parent 51f3532d64
commit 447058020f
3 changed files with 68 additions and 3 deletions

View File

@ -3,6 +3,7 @@
package bytes
import (
"bytes"
"errors"
"fmt"
"io"
@ -87,3 +88,22 @@ func Regexp(pattern string) gigaparsec.Parser[byte, string] {
return gigaparsec.Succeed(true, string(dst), next, gigaparsec.MessageOK(input.Pos())), nil
}
}
func MatchString(s string) gigaparsec.Parser[byte, string] {
expected := fmt.Sprintf("%q", s)
b := []byte(s)
return func(input gigaparsec.State[byte]) (gigaparsec.Result[byte, string], error) {
dst := make([]byte, len(s))
_, next, err := input.Read(dst)
if errors.Is(err, io.EOF) {
return gigaparsec.Fail[byte, string](false, gigaparsec.MessageEnd(input.Pos(), expected)), nil
}
if err != nil {
return gigaparsec.Result[byte, string]{}, fmt.Errorf("MatchString: %w", err)
}
if !bytes.Equal(dst, b) {
return gigaparsec.Fail[byte, string](false, gigaparsec.MakeMessage(input.Pos(), string(dst), expected)), nil
}
return gigaparsec.Succeed(true, s, next, gigaparsec.MessageOK(input.Pos())), nil
}
}