diff --git a/cmd/strom/print_nbt/main.go b/cmd/strom/print_nbt/main.go index da9df0c..2e4a430 100644 --- a/cmd/strom/print_nbt/main.go +++ b/cmd/strom/print_nbt/main.go @@ -25,7 +25,7 @@ func Run(args []string) (err error) { return } defer f.Close() - n, err := nbt.ReadFile(f) + n, err := nbt.ReadUnstructuredFile(f) if err != nil { return } diff --git a/data/registry.go b/data/registry.go index 66b935f..5348690 100644 --- a/data/registry.go +++ b/data/registry.go @@ -15,6 +15,6 @@ func LoadRegistry(name string) (n *nbt.Tag, err error) { return } defer r.Close() - n, err = nbt.ReadFile(r) + n, err = nbt.ReadUnstructuredFile(r) return } diff --git a/level/litematic/main.go b/level/litematic/main.go index 9daae77..4a6b2f9 100644 --- a/level/litematic/main.go +++ b/level/litematic/main.go @@ -97,7 +97,7 @@ func LoadFromPath(path string) (s *Structure, err error) { } func LoadFromFile(r io.Reader) (s *Structure, err error) { - n, err := nbt.ReadFile(r) + n, err := nbt.ReadUnstructuredFile(r) if err != nil { return } diff --git a/level/structure/structure.go b/level/structure/structure.go index 645aafe..323b431 100644 --- a/level/structure/structure.go +++ b/level/structure/structure.go @@ -6,7 +6,7 @@ import ( ) func Load(fileName string) (s *Structure, err error) { - n, err := nbt.ReadFilePath(fileName) + n, err := nbt.ReadUnstructuredFilePath(fileName) if err != nil { return } diff --git a/nbt/file.go b/nbt/file.go index 52e4f76..ee49d38 100644 --- a/nbt/file.go +++ b/nbt/file.go @@ -4,16 +4,28 @@ import ( "compress/gzip" "io" "os" + + "github.com/admin-else/strom/mapstructure" ) -func WriteFile(file io.Writer, n Tag) (err error) { +var Format = mapstructure.NewFormat("nbt", mapstructure.WithRequireAll()) + +func ReadFile(file io.Reader, data any) (err error) { + n, err := ReadUnstructuredFile(file) + if err != nil { + return + } + return Format.Decode(n.Value, data) +} + +func WriteUnstructuredFile(file io.Writer, n Tag) (err error) { gzw := gzip.NewWriter(file) defer gzw.Close() err = n.Encode(gzw) return } -func ReadFile(file io.Reader) (n *Tag, err error) { +func ReadUnstructuredFile(file io.Reader) (n *Tag, err error) { r, err := gzip.NewReader(file) if err != nil { return @@ -24,11 +36,11 @@ func ReadFile(file io.Reader) (n *Tag, err error) { return } -func ReadFilePath(path string) (n *Tag, err error) { +func ReadUnstructuredFilePath(path string) (n *Tag, err error) { f, err := os.Open(path) if err != nil { return } defer f.Close() - return ReadFile(f) + return ReadUnstructuredFile(f) } diff --git a/nbt/snbt.go b/nbt/snbt.go index ca335f5..f586edc 100644 --- a/nbt/snbt.go +++ b/nbt/snbt.go @@ -37,7 +37,7 @@ func PrintSNBTAny(t any, w io.Writer) (err error) { case map[string]any: _, err = fmt.Fprintf(w, "{") for k, v := range t { - _, err = fmt.Fprintf(w, "%q:,", k) + _, err = fmt.Fprintf(w, "%q:", k) err = PrintSNBTAny(v, w) if err != nil { return diff --git a/nbt/snbt_test.go b/nbt/snbt_test.go index 7365930..a81ef29 100644 --- a/nbt/snbt_test.go +++ b/nbt/snbt_test.go @@ -10,7 +10,7 @@ import ( var topSNBT []byte func TestPrintSNBTAny(t *testing.T) { - n, err := ReadFile(bytes.NewReader(topSNBT)) + n, err := ReadUnstructuredFile(bytes.NewReader(topSNBT)) if err != nil { panic(err) } diff --git a/tools/registry_data_hunter/main.go b/tools/registry_data_hunter/main.go index 94c5500..5761a49 100644 --- a/tools/registry_data_hunter/main.go +++ b/tools/registry_data_hunter/main.go @@ -143,7 +143,7 @@ func handleClient(c *proto.Conn) (err error) { return } defer f.Close() - err = nbt.WriteFile(f, p.Data) + err = nbt.WriteUnstructuredFile(f, p.Data) slog.Info("saved", "file", SaveAs) return }