aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/state/multi.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-10-26 01:49:14 +0900
committerOphestra <cat@gensokyo.uk>2025-10-26 01:49:14 +0900
commit86f4219062ae4787ac9478b025abf8416e5593a2 (patch)
tree6585322aa8f8234c42b355982c6dd66917220600 /internal/app/state/multi.go
parentfe2929d5f7249f8593923446e1c327bf503cc8a0 (diff)
internal/app/state/data: check full entry behaviour
This eventually gets relocated to internal/app. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/app/state/multi.go')
-rw-r--r--internal/app/state/multi.go29
1 files changed, 9 insertions, 20 deletions
diff --git a/internal/app/state/multi.go b/internal/app/state/multi.go
index 695bff1d..446d6ce5 100644
--- a/internal/app/state/multi.go
+++ b/internal/app/state/multi.go
@@ -1,7 +1,6 @@
package state
import (
- "encoding/gob"
"errors"
"fmt"
"io/fs"
@@ -161,25 +160,18 @@ func (b *multiBackend) load(decode bool) (map[hst.ID]*hst.State, error) {
// append regardless, but only parse if required, implements Len
if decode {
- var et hst.Enablement
- if et, err = entryReadHeader(f); err != nil {
+ if err = entryDecode(f, &s); err != nil {
_ = f.Close()
- return &hst.AppError{Step: "decode state header", Err: err}
- } else if err = gob.NewDecoder(f).Decode(&s); err != nil {
- _ = f.Close()
- return &hst.AppError{Step: "decode state body", Err: err}
- } else if s.ID != id {
- _ = f.Close()
- return fmt.Errorf("state entry %s has unexpected id %s", id, &s.ID)
- } else if err = f.Close(); err != nil {
- return &hst.AppError{Step: "close state file", Err: err}
- } else if err = s.Config.Validate(); err != nil {
return err
- } else if s.Enablements.Unwrap() != et {
- return fmt.Errorf("state entry %s has unexpected enablement byte %x, %x", id, s.Enablements, et)
+ } else if s.ID != id {
+ return &hst.AppError{Step: "validate state identifier", Err: os.ErrInvalid,
+ Msg: fmt.Sprintf("state entry %s has unexpected id %s", id, &s.ID)}
}
}
+ if err = f.Close(); err != nil {
+ return &hst.AppError{Step: "close state file", Err: err}
+ }
return nil
}
}(); err != nil {
@@ -202,12 +194,9 @@ func (b *multiBackend) Save(state *hst.State) error {
statePath := b.filename(&state.ID)
if f, err := os.OpenFile(statePath, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600); err != nil {
return &hst.AppError{Step: "create state file", Err: err}
- } else if err = entryWriteHeader(f, state.Enablements.Unwrap()); err != nil {
- _ = f.Close()
- return &hst.AppError{Step: "encode state header", Err: err}
- } else if err = gob.NewEncoder(f).Encode(state); err != nil {
+ } else if err = entryEncode(f, state); err != nil {
_ = f.Close()
- return &hst.AppError{Step: "encode state body", Err: err}
+ return err
} else if err = f.Close(); err != nil {
return &hst.AppError{Step: "close state file", Err: err}
}