Files
go-mc/server/command/parsers.go
patyhank 185020e31c
Some checks failed
CodeQL / Analyze (go) (push) Has been cancelled
Go / Test (1.22) (push) Has been cancelled
Go / Test (^1.22) (push) Has been cancelled
Squashed below commits
nbt chat message

fixes some bug

chunk temp

relocate module

items id
2025-08-27 20:29:40 +08:00

74 lines
1.4 KiB
Go

package command
import (
"io"
"strconv"
"strings"
pk "git.konjactw.dev/falloutBot/go-mc/net/packet"
)
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),
}.WriteTo(w)
}
func (s StringParser) Parse(cmd string) (left string, value ParsedData, err error) {
switch s {
case 2: // Greedy Phrase
return "", cmd, nil
case 1: // Quotable Phrase
if len(cmd) > 0 && cmd[0] == '"' {
var sb strings.Builder
var isEscaping bool
for i, v := range cmd[1:] {
if isEscaping {
isEscaping = false
switch v {
case '\\':
sb.WriteRune('\\')
case '"':
sb.WriteRune('"')
}
} else if v == '\\' {
isEscaping = true
} else if v == '"' {
return cmd[:i], sb.String(), nil
} else {
sb.WriteRune(v)
}
}
return cmd, nil, ParseErr{
Pos: len(cmd) - 1,
Err: "expected '\"'",
}
}
fallthrough
case 0: // Single Word
i := strings.IndexAny(cmd, "\t\n\v\f\r ")
if i == -1 {
return "", cmd, nil
}
return cmd[i:], cmd[:i], nil
default:
panic("StringParser: unknown format 0x" + strconv.FormatInt(int64(s), 16))
}
}
type ParseErr struct {
Pos int
Err string
}
func (p ParseErr) Error() string {
return p.Err
}