61 lines
866 B
Go
61 lines
866 B
Go
// Package nbt implement the Named Binary Tag format of Minecraft.
|
|
// It provides api like encoding/xml package.
|
|
package nbt
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
//Tag type IDs
|
|
const (
|
|
TagEnd byte = iota
|
|
TagByte
|
|
TagShort
|
|
TagInt
|
|
TagLong
|
|
TagFloat
|
|
TagDouble
|
|
TagByteArray
|
|
TagString
|
|
TagList
|
|
TagCompound
|
|
TagIntArray
|
|
TagLongArray
|
|
TagNone = 0xFF
|
|
)
|
|
|
|
func IsArrayTag(ty byte) bool {
|
|
return ty == TagByteArray || ty == TagIntArray || ty == TagLongArray
|
|
}
|
|
|
|
type DecoderReader = interface {
|
|
io.ByteReader
|
|
io.Reader
|
|
}
|
|
type Decoder struct {
|
|
r DecoderReader
|
|
}
|
|
|
|
func NewDecoder(r io.Reader) *Decoder {
|
|
d := new(Decoder)
|
|
if br, ok := r.(DecoderReader); ok {
|
|
d.r = br
|
|
} else {
|
|
d.r = reader{r}
|
|
}
|
|
return d
|
|
}
|
|
|
|
type reader struct {
|
|
io.Reader
|
|
}
|
|
|
|
func (r reader) ReadByte() (byte, error) {
|
|
var b [1]byte
|
|
n, err := r.Read(b[:])
|
|
if n == 1 {
|
|
return b[0], nil
|
|
}
|
|
return 0, err
|
|
}
|