summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--load.go75
1 files changed, 55 insertions, 20 deletions
diff --git a/load.go b/load.go
index c9fef7d..48b6d4e 100644
--- a/load.go
+++ b/load.go
@@ -65,70 +65,105 @@ func ConfigLoad(pb proto.Message, argname string, protoname string) error {
}
// loads from the users .cache dir
-// todo: err handling
+// if the .proto file version changes, automatically delete the .pb
+// file. This is important to avoid marshalling garbage data
+// .cache files are treated as such, a "cache" file. don't keep important
+// things in here. argv stores the information here for autodelete
func LoadCache(pb proto.Message, argname string, protoname string) error {
cacheDir, _ := os.UserCacheDir()
fullpath := filepath.Join(cacheDir, argname)
os.MkdirAll(fullpath, os.ModePerm)
fullname := filepath.Join(fullpath, protoname+".pb")
_, err := SetFilename(pb, fullname)
- return errors.Join(err, LoadPB(pb))
+ if err != nil {
+ pb = nil
+ os.Remove(fullname)
+ return err
+ }
+ newver, curver, err := LoadVersionCheckPB(pb)
+ if err != nil {
+ pb = nil
+ os.Remove(fullname)
+ return err
+ }
+ _, _ = newver, curver
+ return nil
}
-// this logic isn't great yet
-func LoadPB(pb proto.Message) error {
+func LoadVersionCheckPB(pb proto.Message) (string, string, error) {
+ var newver string
+ var pbver string
+ var err error
+
fullname, err := GetFilename(pb)
if err != nil {
- return err
+ return newver, pbver, err
}
// text is supposed to be "easy". Don't verify 'version'
if strings.HasSuffix(fullname, ".text") {
- return loadTEXT(pb, fullname)
+ err = loadTEXT(pb, fullname)
+ return newver, pbver, err
}
// verify 'version' for .pb files
// application will panic if they don't match
var worked bool
- ver, err := GetString(pb, "version")
+ newver, err = GetString(pb, "version")
if err != nil {
- return errors.Join(err, errors.New("'Version' is not in: "+fullname))
+ return newver, pbver, err
}
// maybe don't really verify .json files (?)
// doing it for now anyway. maybe just return an error
if strings.HasSuffix(fullname, ".json") {
- if err := loadJSON(pb, fullname); err != nil {
- return err
+ if err = loadJSON(pb, fullname); err != nil {
+ return newver, pbver, err
}
worked = true
}
if strings.HasSuffix(fullname, ".pb") {
- if err := loadPB(pb, fullname); err != nil {
- return err
+ if err = loadPB(pb, fullname); err != nil {
+ return newver, pbver, err
}
- _, err := SetFilename(pb, fullname)
+ _, err = SetFilename(pb, fullname)
if err != nil {
- return err
+ return newver, pbver, err
}
worked = true
}
if !worked {
- return fmt.Errorf("unknown filetype '%s'", fullname)
+ return newver, pbver, fmt.Errorf("unknown filetype '%s'", fullname)
+ }
+ // get the version from the current PB saved on disk
+ pbver, _ = GetString(pb, "version")
+ if newver != pbver {
+ return newver, pbver, VersionMismatch
+ }
+ return newver, pbver, nil
+}
+
+// uses the version to panic. This is needed because loading binary
+// protobuf files with rearranged messages is indeterminate
+func LoadPB(pb proto.Message) error {
+ fullname, err := GetFilename(pb)
+ if err != nil {
+ return err
}
- newver, _ := GetString(pb, "version")
- if ver != newver {
+ newver, pbver, err := LoadVersionCheckPB(pb)
+ if newver != pbver {
fmt.Println("")
- fmt.Printf("VERSION '%s' != '%s'\n", ver, newver)
+ fmt.Printf("VERSION new '%s' != cur PB '%s'\n", newver, pbver)
fmt.Println("")
fmt.Println("Your protobuf file is old and can not be loaded")
fmt.Println("your application must decide how to handle this (delete or fix)")
fmt.Println("always panic here. application is broken")
fmt.Println("You must delete or convert the file", fullname)
fmt.Println("")
- // probably should ALWAYS PANIC HERE // upon further study, always panic here is better than not
+ // probably should ALWAYS PANIC HERE
+ // upon further study, always panic here is better than not
s := fmt.Sprintf("protobuf version wrong. delete or fix %s", fullname)
panic(s)
}
- return nil
+ return err
}
func LoadFromFilename(pb proto.Message, fullname string) error {