look at the code if you want to know what i did
This commit is contained in:
+3
-1
@@ -291,6 +291,8 @@ func readPayload(id int8, r io.Reader) (ret any, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
var UnknownTagTypeErr = errors.New("unknown nbt type")
|
||||
|
||||
func writePayload(v any, w io.Writer) (err error) {
|
||||
switch v := v.(type) {
|
||||
case struct{}:
|
||||
@@ -361,7 +363,7 @@ func writePayload(v any, w io.Writer) (err error) {
|
||||
}
|
||||
err = binary.Write(w, Order, End)
|
||||
default:
|
||||
err = errors.New("unknown nbt type")
|
||||
err = UnknownTagTypeErr
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
package nbt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
// PrintSNBTAny documented at https://minecraft.wiki/w/NBT_format#SNBT_format
|
||||
func PrintSNBTAny(t any, w io.Writer) (err error) {
|
||||
switch t := t.(type) {
|
||||
case int8:
|
||||
_, err = fmt.Fprintf(w, "%vB", t)
|
||||
case bool:
|
||||
_, err = fmt.Fprintf(w, "%v", t)
|
||||
case int16:
|
||||
_, err = fmt.Fprintf(w, "%vS", t)
|
||||
case int32:
|
||||
_, err = fmt.Fprintf(w, "%vI", t)
|
||||
case int64:
|
||||
_, err = fmt.Fprintf(w, "%vL", t)
|
||||
case float32:
|
||||
_, err = fmt.Fprintf(w, "%vF", t)
|
||||
case float64:
|
||||
_, err = fmt.Fprintf(w, "%vD", t)
|
||||
case string:
|
||||
_, err = fmt.Fprintf(w, "%q", t)
|
||||
case []any:
|
||||
_, err = fmt.Fprintf(w, "[")
|
||||
for _, v := range t {
|
||||
err = PrintSNBTAny(v, w)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = fmt.Fprintf(w, ",")
|
||||
}
|
||||
_, err = fmt.Fprintf(w, "]")
|
||||
case map[string]any:
|
||||
_, err = fmt.Fprintf(w, "{")
|
||||
for k, v := range t {
|
||||
_, err = fmt.Fprintf(w, "%q:,", k)
|
||||
err = PrintSNBTAny(v, w)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = fmt.Fprintf(w, ",")
|
||||
}
|
||||
_, err = fmt.Fprintf(w, "}")
|
||||
case []int8:
|
||||
_, err = fmt.Fprintf(w, "[B;")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range t {
|
||||
err = PrintSNBTAny(v, w)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = fmt.Fprintf(w, ",")
|
||||
}
|
||||
_, err = fmt.Fprintf(w, "]")
|
||||
case []int32:
|
||||
_, err = fmt.Fprintf(w, "[I;")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range t {
|
||||
err = PrintSNBTAny(v, w)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = fmt.Fprintf(w, ",")
|
||||
}
|
||||
_, err = fmt.Fprintf(w, "]")
|
||||
case []int64:
|
||||
_, err = fmt.Fprintf(w, "[L;")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range t {
|
||||
err = PrintSNBTAny(v, w)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = fmt.Fprintf(w, ",")
|
||||
}
|
||||
_, err = fmt.Fprintf(w, "]")
|
||||
default:
|
||||
err = UnknownTagTypeErr
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package nbt
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
_ "embed"
|
||||
"testing"
|
||||
)
|
||||
|
||||
//go:embed testdata/top_0_20.nbt
|
||||
var topSNBT []byte
|
||||
|
||||
func TestPrintSNBTAny(t *testing.T) {
|
||||
n, err := ReadFile(bytes.NewReader(topSNBT))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
bb := bytes.NewBuffer(nil)
|
||||
err = PrintSNBTAny(n.Value, bb)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
t.Log(bb.String())
|
||||
}
|
||||
Vendored
BIN
Binary file not shown.
Reference in New Issue
Block a user