diff options
| author | Jeff Carr <[email protected]> | 2025-10-02 17:36:56 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-02 17:36:56 -0500 |
| commit | 9449405677c0a6f7b22c4aa9976ec3c718c5857a (patch) | |
| tree | 966e510abbd8004768460182fbca06a3e07ec3e5 | |
| parent | f9cb700a6045d8f2c5d3adb87fb6256125576e36 (diff) | |
this might not work
| -rw-r--r-- | load.go | 63 |
1 files changed, 51 insertions, 12 deletions
@@ -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 } |
