nbt.StringifiedNBT as nbt.NBTEncoder

This commit is contained in:
Tnze
2021-07-05 01:28:07 +08:00
parent d7091db5b3
commit 2112a604f1
2 changed files with 72 additions and 5 deletions

View File

@ -1,10 +1,58 @@
package nbt package nbt
type StringifiedNBT struct { import "io"
Name string
Content string type StringifiedNBT string
func (n StringifiedNBT) TagType() (tagType byte) {
d := decodeState{data: []byte(n)}
d.scan.reset()
d.scanWhile(scanSkipSpace)
switch d.opcode {
case scanBeginLiteral:
start := d.readIndex()
if d.scanWhile(scanContinue); d.opcode == scanError {
return
}
literal := d.data[start:d.readIndex()]
tagType, _ = parseLiteral(literal)
case scanBeginCompound:
tagType = TagCompound
case scanBeginList:
d.scanWhile(scanSkipSpace)
if d.opcode == scanBeginLiteral {
start := d.readIndex()
if d.scanWhile(scanContinue); d.opcode == scanError {
return
}
literal := d.data[start:d.readIndex()]
if d.opcode == scanSkipSpace {
d.scanWhile(scanSkipSpace)
}
if d.opcode == scanListType {
switch literal[0] {
case 'B':
tagType = TagByteArray
case 'I':
tagType = TagIntArray
case 'L':
tagType = TagLongArray
}
}
} else {
tagType = TagList
}
}
return
} }
func (n *StringifiedNBT) Decode(tagType byte, tagName string, r DecoderReader) error { func (n StringifiedNBT) Encode(w io.Writer) error {
panic("unimplemented") d := decodeState{data: []byte(n)}
d.scan.reset()
return writeValue(NewEncoder(w), &d, "")
} }
//func (n *StringifiedNBT) Decode(tagType byte, r DecoderReader) error {
//}

View File

@ -109,3 +109,22 @@ func Test_WriteSNBT_nestingList(t *testing.T) {
t.Error("Exceeded the maximum depth of support, but no error was reported") t.Error("Exceeded the maximum depth of support, but no error was reported")
} }
} }
func TestStringifiedNBT_TagType(t *testing.T) {
for _, v := range []struct {
snbt string
Type byte
}{
{`123B`, TagByte},
{`123`, TagInt},
{`[]`, TagList},
{`[B;]`, TagByteArray},
{`[I;]`, TagIntArray},
{`[L;]`, TagLongArray},
{`{abc:123B}`, TagCompound},
} {
if T := StringifiedNBT(v.snbt).TagType(); T != v.Type {
t.Errorf("Parse SNBT TagType error: %s is %d, not %d", v.snbt, v.Type, T)
}
}
}