summaryrefslogtreecommitdiff
path: root/server/data.go
diff options
context:
space:
mode:
authorraven <citrons@mondecitronne.com>2026-03-20 17:01:30 -0500
committerraven <citrons@mondecitronne.com>2026-03-20 17:01:30 -0500
commit4247e0efaaab9560afa5ce2ca8b3aec80141a6d9 (patch)
tree620c6f0b5071351f8b19bc45bf075f90491fbefa /server/data.go
parentc3d63652a4b80add587ee17f5c9f3773417203ad (diff)
store world data in JSON
Diffstat (limited to 'server/data.go')
-rw-r--r--server/data.go36
1 files changed, 29 insertions, 7 deletions
diff --git a/server/data.go b/server/data.go
index b7ed280..331ac38 100644
--- a/server/data.go
+++ b/server/data.go
@@ -2,7 +2,8 @@ package server
import (
"os"
- "encoding/binary"
+ "bufio"
+ "encoding/json"
"git.citrons.xyz/metronode/phony"
)
@@ -53,13 +54,14 @@ func (f atomicWriter) Close() error {
}
func saveDataFile[T any](from phony.Actor, name string, data T) {
- f, err := createAtomic(from, "world/" + name + ".bin")
+ f, err := createAtomic(from, "world/" + name + ".json")
if err != nil {
dataManager.errHand.OnSaveError(from, err)
return
}
defer f.Close()
- err = binary.Write(f, binary.BigEndian, data)
+ enc := json.NewEncoder(f)
+ err = enc.Encode(data)
if err != nil {
dataManager.errHand.OnSaveError(from, err)
}
@@ -68,7 +70,14 @@ func saveDataFile[T any](from phony.Actor, name string, data T) {
func loadDataFile[T any](
from phony.Actor, name string, reply func(data T, ok bool)) {
dataManager.Act(from, func() {
- f, err := os.Open("world/" + name + ".bin")
+ var (
+ data T
+ f *os.File
+ err error
+ )
+ defer from.Act(nil, func() {reply(data, err == nil)})
+
+ f, err = os.Open("world/" + name + ".json")
if err != nil {
if !os.IsNotExist(err) {
dataManager.errHand.OnLoadError(&dataManager, err)
@@ -76,12 +85,25 @@ func loadDataFile[T any](
return
}
defer f.Close()
- var data T
- err = binary.Read(f, binary.BigEndian, &data)
+
+ dec := json.NewDecoder(f)
+ err = dec.Decode(&data)
if err != nil {
dataManager.errHand.OnLoadError(&dataManager, err)
+ return
}
- from.Act(nil, func() {reply(data, err == nil)})
})
}
+func readDataField(rd *bufio.Reader, data any) error {
+ line, err := rd.ReadBytes('\n')
+ if err != nil {
+ return err
+ }
+ return json.Unmarshal(line, data)
+}
+
+func writeDataField(wr *bufio.Writer, data any) error {
+ enc := json.NewEncoder(wr)
+ return enc.Encode(data)
+}