diff --git a/load.go b/load.go index 202453d..711c1a5 100644 --- a/load.go +++ b/load.go @@ -7,8 +7,10 @@ import ( "errors" "os" "path/filepath" + "strings" "go.wit.com/log" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" ) @@ -26,15 +28,35 @@ var ErrEmpty error = log.Errorf("file was empty") // - []byte : the contents of the file // - error on read func ConfigLoad(pb proto.Message, argname string, protoname string) error { - var data []byte var fullname string homeDir, err := os.UserHomeDir() if err != nil { + log.Warn("ConfigLoad() UserHomeDir() err", err) return err } fullname = filepath.Join(homeDir, ".config", argname, protoname+".text") + if err := loadTEXT(pb, fullname); err == nil { + return nil + } + + if strings.HasSuffix(fullname, ".text") { + fullname = strings.TrimSuffix(fullname, ".text") + fullname += ".json" + if err := loadJSON(pb, fullname); err != nil { + return err + } + return nil + } + + log.Info("Config file load failed:", fullname) + return log.Errorf("could not load config file") +} + +func loadTEXT(pb proto.Message, fullname string) error { + var data []byte + var err error if data, err = loadFile(fullname); err != nil { log.Warn("config file failed to load", err) // set pb.Filename that was attempted @@ -44,11 +66,50 @@ func ConfigLoad(pb proto.Message, argname string, protoname string) error { // don't even bother with Marshal() if data == nil { + log.Warn("ConfigLoad() config file was empty", fullname) return ErrEmpty // file is empty } // Unmarshal() if err = prototext.Unmarshal(data, pb); err != nil { + log.Warn("ConfigLoad() file", fullname) + log.Warn("ConfigLoad() Unmarshal() err", err) + return err + } + + if fn, ok := GetFilename(pb); ok { + if fn != fullname { + log.Info("config.ConfigLoad() new filename:", fullname) + SetFilename(pb, fullname) + } + } + + if os.Getenv("CONFIG_VERBOSE") == "true" { + log.Infof("ConfigLoad() %s len()=%d\n", fullname, len(data)) + } + return nil +} + +func loadJSON(pb proto.Message, fullname string) error { + var data []byte + var err error + if data, err = loadFile(fullname); err != nil { + log.Warn("config file failed to load", err) + // set pb.Filename that was attempted + SetFilename(pb, fullname) + return err + } + + // don't even bother with Marshal() + if data == nil { + log.Warn("ConfigLoad() config file was empty", fullname) + return ErrEmpty // file is empty + } + + // Unmarshal() + if err = protojson.Unmarshal(data, pb); err != nil { + log.Warn("ConfigLoad() file", fullname) + log.Warn("ConfigLoad() Unmarshal() err", err) return err } diff --git a/save.go b/save.go index a1f48e0..6231b3b 100644 --- a/save.go +++ b/save.go @@ -4,8 +4,10 @@ import ( "fmt" "os" "path/filepath" + "strings" "go.wit.com/log" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" ) @@ -41,21 +43,43 @@ func ConfigSaveWithHeader(pb proto.Message, header string) error { return ErrProtoFilename } - s := prototext.Format(pb) - dir, name := filepath.Split(fullname) if name == "" { return fmt.Errorf("filename was blank") } - err := os.MkdirAll(dir, os.ModePerm) - if err != nil { + if err := os.MkdirAll(dir, os.ModePerm); err != nil { return err } + var final error + if err := configTEXT(fullname, pb, header); err != nil { + final = err + } + + if strings.HasSuffix(fullname, ".text") { + fullname = strings.TrimSuffix(fullname, ".text") + fullname += ".json" + if err := configJSON(fullname, pb); err != nil { + final = err + } + } + return final +} + +func configTEXT(fullname string, pb proto.Message, header string) error { + s := prototext.Format(pb) + log.Infof("ConfigSave() filename=%s %d\n", fullname, len(s)) return configWrite(fullname, []byte(header+s)) } +func configJSON(fullname string, pb proto.Message) error { + data := protojson.Format(pb) + + log.Infof("ConfigSave() filename=%s %d\n", fullname, len(data)) + return configWrite(fullname, []byte(data)) +} + func configWrite(fullname string, data []byte) error { cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)