package config import ( "errors" "fmt" "os" "path/filepath" "strings" "go.wit.com/lib/ENV" "google.golang.org/protobuf/proto" ) // loads foo.proto from ~/.config//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 { fmt.Println("FILENAME COULD NOT BE SET old=", curfilename) fmt.Println("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 { fmt.Println("FILENAME COULD NOT BE SET old=", curfilename) fmt.Println("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 }