Command parsers plan 3

This commit is contained in:
Tnze
2022-01-03 12:36:57 +08:00
parent 57b5649f53
commit 9433dd98de
4 changed files with 277 additions and 228 deletions

View File

@ -8,22 +8,23 @@ import (
pk "github.com/Tnze/go-mc/net/packet"
)
type StringParser struct {
Format int32
V string
type Parser interface {
Parse(cmd string) (left string, value ParsedData, err error)
}
type StringParser int32
func (s StringParser) WriteTo(w io.Writer) (int64, error) {
return pk.Tuple{
pk.Identifier("brigadier:string"),
pk.VarInt(s.Format),
pk.VarInt(s),
}.WriteTo(w)
}
func (s StringParser) Parse(cmd string) (token string, value interface{}, err error) {
switch s.Format {
func (s StringParser) Parse(cmd string) (left string, value ParsedData, err error) {
switch s {
case 2: // Greedy Phrase
return cmd, cmd, nil
return "", cmd, nil
case 1: // Quotable Phrase
if len(cmd) > 0 && cmd[0] == '"' {
var sb strings.Builder
@ -45,7 +46,7 @@ func (s StringParser) Parse(cmd string) (token string, value interface{}, err er
sb.WriteRune(v)
}
}
return "", nil, ParseErr{
return cmd, nil, ParseErr{
Pos: len(cmd) - 1,
Err: "expected '\"'",
}
@ -54,11 +55,11 @@ func (s StringParser) Parse(cmd string) (token string, value interface{}, err er
case 0: // Single Word
i := strings.IndexAny(cmd, "\t\n\v\f\r ")
if i == -1 {
return cmd, cmd, nil
return "", cmd, nil
}
return cmd[:i], cmd[:i], nil
return cmd[i:], cmd[:i], nil
default:
panic("StringParser: unknown format 0x" + strconv.FormatInt(int64(s.Format), 16))
panic("StringParser: unknown format 0x" + strconv.FormatInt(int64(s), 16))
}
}