92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
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
|
|
}
|