summaryrefslogtreecommitdiff
path: root/configDir.go
diff options
context:
space:
mode:
Diffstat (limited to 'configDir.go')
-rw-r--r--configDir.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/configDir.go b/configDir.go
new file mode 100644
index 0000000..2f034f3
--- /dev/null
+++ b/configDir.go
@@ -0,0 +1,88 @@
+package config
+
+import (
+ "errors"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "go.wit.com/lib/ENV"
+ "go.wit.com/log"
+ "google.golang.org/protobuf/proto"
+)
+
+// loads foo.proto from ~/.config/<appname>/foo.text
+func LoadConfigDir(pb proto.Message) error {
+ appname, err := ENV.GetAppname() // already configured by your application
+ if err != nil {
+ return err
+ }
+ protoname, err := GetProtobufName(pb) // defined in the foo.proto file
+ if err != nil {
+ return err
+ }
+
+ curfilename, err := GetFilename(pb)
+ if err == nil {
+ return err
+ }
+
+ // Get ~/.config/appname/protoname.text
+ fullname := MakeConfigFilename(appname, protoname)
+
+ if err = loadTEXT(pb, fullname); err == nil {
+ // If the config is old or broken, this sets the filename
+ if curfilename != fullname {
+ _, err := SetFilename(pb, fullname)
+ if err != nil {
+ log.Info("FILENAME COULD NOT BE SET old=", curfilename)
+ log.Info("FILENAME COULD NOT BE SET new=", fullname)
+ return errors.Join(err, errors.New("something is wrong in lib/config"))
+ }
+ }
+ return nil
+ } else {
+ if strings.HasSuffix(fullname, ".text") {
+ fulljson := fullname + ".json"
+ // If the config is old or broken, this sets the filename
+ if err := loadJSON(pb, fulljson); err == nil {
+ if curfilename != fullname {
+ _, err := SetFilename(pb, fullname)
+ if err != nil {
+ log.Info("FILENAME COULD NOT BE SET old=", curfilename)
+ log.Info("FILENAME COULD NOT BE SET new=", fullname)
+ return errors.Join(err, errors.New("something is wrong in lib/config"))
+ }
+ }
+ return nil
+ }
+ }
+ }
+ return ErrMarshal
+}
+
+func LoadConfigPB(pb proto.Message, appname string, protoname string) (string, error) {
+ var fullname string
+ if strings.HasPrefix(appname, "/") {
+ fullname = filepath.Join(appname, protoname+".pb")
+ } else {
+ configDir, err := os.UserConfigDir()
+ if err != nil {
+ return "", err
+ }
+
+ fullname = filepath.Join(configDir, appname, protoname+".pb")
+ }
+
+ data, err := loadFile(fullname)
+ if err != nil {
+ return fullname, err
+ }
+
+ // Unmarshal()
+ if err = proto.Unmarshal(data, pb); err != nil {
+ return fullname, err
+ }
+
+ return fullname, nil
+}