package config 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" ) var ErrProtoFilename error = log.Errorf("proto does not have Filename") func ConfigSave(pb proto.Message) error { // log.Infof("ConfigSave() filename=%s %d\n", fullname, len(s)) return saveTEXT(pb, "") } func SavePB(pb proto.Message, fullname string) error { if !strings.HasSuffix(fullname, ".pb") { // todo: append .text here? return log.Errorf("%s needs to end in '.pb'", fullname) } dir, name := filepath.Split(fullname) if name == "" { return fmt.Errorf("filename was blank") } if err := os.MkdirAll(dir, os.ModePerm); err != nil { return err } data, err := proto.Marshal(pb) if err != nil { return err } log.Infof("ConfigSave() filename=%s %d\n", fullname, len(data)) return configWrite(fullname, data) } func ConfigSaveWithHeader(pb proto.Message, header string) error { var final error if err := saveTEXT(pb, header); err != nil { final = err } if err := saveJSON(pb); 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 saveTEXT(pb proto.Message, header string) error { // get pb.Filename if it is there in the .proto file fullname, ok := GetFilename(pb) if !ok { return ErrProtoFilename } if !strings.HasSuffix(fullname, ".text") { // todo: append .text here? return log.Errorf("not .text file: %s", fullname) } dir, name := filepath.Split(fullname) if name == "" { return fmt.Errorf("filename was blank") } if err := os.MkdirAll(dir, os.ModePerm); err != nil { return err } s := prototext.Format(pb) log.Infof("ConfigSave() filename=%s %d\n", fullname, len(s)) return configWrite(fullname, []byte(header+s)) } func saveJSON(pb proto.Message) error { // get pb.Filename if it is there in the .proto file fullname, ok := GetFilename(pb) if !ok { return ErrProtoFilename } if !strings.HasSuffix(fullname, ".text") { // todo: append .text here? return log.Errorf("not .text file: %s", fullname) } dir, name := filepath.Split(fullname) if name == "" { return fmt.Errorf("filename was blank") } if err := os.MkdirAll(dir, os.ModePerm); err != nil { return err } data := protojson.Format(pb) fullname += ".json" 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) defer cfgfile.Close() if err != nil { log.Warn("open config file :", err) return err } _, err = cfgfile.Write(data) return err } /* func (e *Events) Save() { var fullname string base, _ := filepath.Split(argv.Config) fullname = filepath.Join(base, "events.pb") data, err := e.Marshal() if err != nil { log.Info("proto.Marshal() failed", err) return } log.Info("proto.Marshal() worked len", len(data)) configWrite(fullname, data) } */