diff options
Diffstat (limited to 'configDir.go')
| -rw-r--r-- | configDir.go | 88 |
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 +} |
