summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-10-02 17:36:56 -0500
committerJeff Carr <[email protected]>2025-10-02 17:36:56 -0500
commit9449405677c0a6f7b22c4aa9976ec3c718c5857a (patch)
tree966e510abbd8004768460182fbca06a3e07ec3e5
parentf9cb700a6045d8f2c5d3adb87fb6256125576e36 (diff)
this might not work
-rw-r--r--load.go63
1 files changed, 51 insertions, 12 deletions
diff --git a/load.go b/load.go
index 84a13c4..27b0396 100644
--- a/load.go
+++ b/load.go
@@ -21,7 +21,8 @@ func Load(argname string) ([]byte, string) {
}
*/
-var ErrEmpty error = log.Errorf("file was empty")
+var ErrEmpty error = log.Errorf("config file was empty")
+var ErrMarshal error = log.Errorf("protobuf parse error")
// returns:
// - Full path to the config file. usually: ~/.config/<argname>
@@ -29,6 +30,7 @@ var ErrEmpty error = log.Errorf("file was empty")
// - error on read
func ConfigLoad(pb proto.Message, argname string, protoname string) error {
var fullname string
+ var err error
homeDir, err := os.UserHomeDir()
if err != nil {
log.Warn("ConfigLoad() UserHomeDir() err", err)
@@ -37,20 +39,34 @@ func ConfigLoad(pb proto.Message, argname string, protoname string) error {
fullname = filepath.Join(homeDir, ".config", argname, protoname+".text")
- if err := loadTEXT(pb, fullname); err == nil {
- return nil
+ // if both don't exist or both are empty, return known errors
+ // these can be used to detect if the user is new to the application
+ if err := missingConfig(fullname); err != nil {
+ if errors.Is(err, os.ErrNotExist) {
+ return os.ErrNotExist
+ }
+ if errors.Is(err, ErrEmpty) {
+ return ErrEmpty
+ }
+ log.Info("ConfigLoad() error", fullname, err)
+ return err
}
- if strings.HasSuffix(fullname, ".text") {
- fullname += ".json"
- if err := loadJSON(pb, fullname); err != nil {
- return err
- }
+ if err = loadTEXT(pb, fullname); err == nil {
return nil
+ } else {
+ if strings.HasSuffix(fullname, ".text") {
+ fulljson := fullname + ".json"
+ if err := loadJSON(pb, fulljson); err == nil {
+ return nil
+ } else {
+ log.Info("Config file load failed:", fulljson, err)
+ }
+ }
}
- log.Info("Config file load failed:", fullname)
- return log.Errorf("could not load config file")
+ log.Info("Config file load failed:", fullname, err)
+ return ErrMarshal
}
func LoadFile(pb proto.Message, fullname string) error {
@@ -134,7 +150,7 @@ func loadTEXT(pb proto.Message, fullname string) error {
if err = prototext.Unmarshal(data, pb); err != nil {
log.Warn("ConfigLoad() file", fullname)
log.Warn("ConfigLoad() Unmarshal() err", err)
- return err
+ return ErrMarshal
}
if fn, ok := GetFilename(pb); ok {
@@ -170,7 +186,7 @@ func loadJSON(pb proto.Message, fullname string) error {
if err = protojson.Unmarshal(data, pb); err != nil {
log.Warn("ConfigLoad() file", fullname)
log.Warn("ConfigLoad() Unmarshal() err", err)
- return err
+ return ErrMarshal
}
if fn, ok := GetFilename(pb); ok {
@@ -186,6 +202,26 @@ func loadJSON(pb proto.Message, fullname string) error {
return nil
}
+// dumb but simple to read logic
+func missingConfig(fullname string) error {
+ data1, err1 := os.ReadFile(fullname)
+ if ! errors.Is(err1, os.ErrNotExist) {
+ return err1
+ }
+
+ data2, err2 := os.ReadFile(fullname + ".json")
+ if ! errors.Is(err2, os.ErrNotExist) {
+ return err2
+ }
+ if errors.Is(err1, os.ErrNotExist) && errors.Is(err2, os.ErrNotExist) {
+ return os.ErrNotExist
+ }
+ if (len(data1) == 0) && (len(data2) == 0) {
+ return ErrEmpty
+ }
+ return nil
+}
+
func loadFile(fullname string) ([]byte, error) {
data, err := os.ReadFile(fullname)
if errors.Is(err, os.ErrNotExist) {
@@ -196,5 +232,8 @@ func loadFile(fullname string) ([]byte, error) {
// log.Info("open config file :", err)
return nil, err
}
+ if (len(data) == 0) {
+ return data, ErrEmpty
+ }
return data, nil
}