summaryrefslogtreecommitdiff
path: root/save.go
diff options
context:
space:
mode:
Diffstat (limited to 'save.go')
-rw-r--r--save.go162
1 files changed, 162 insertions, 0 deletions
diff --git a/save.go b/save.go
new file mode 100644
index 0000000..d257649
--- /dev/null
+++ b/save.go
@@ -0,0 +1,162 @@
+package config
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "google.golang.org/protobuf/encoding/protojson"
+ "google.golang.org/protobuf/encoding/prototext"
+ "google.golang.org/protobuf/proto"
+)
+
+var ErrProtoFilename error = fmt.Errorf("proto does not have Filename")
+
+func ConfigSave(pb proto.Message) error {
+ return saveTEXT(pb, "")
+}
+
+// writes the protobuf to disk
+// uses the already configured Filename
+func SavePB(pb proto.Message) error {
+ fullname, err := GetFilename(pb)
+ if err != nil {
+ return err
+ }
+ return SaveToFilename(pb, fullname)
+}
+
+// writes the protobuf to disk (sets Filename if PB has 'Filename')
+func SaveToFilename(pb proto.Message, fullname string) error {
+ basedir, _ := filepath.Split(fullname)
+ if err := os.MkdirAll(basedir, os.ModePerm); err != nil {
+ return err
+ }
+ if strings.HasSuffix(fullname, ".pb") {
+ return saveProto(pb, fullname)
+ }
+ if strings.HasSuffix(fullname, ".text") {
+ return saveTEXT(pb, "")
+ }
+ if strings.HasSuffix(fullname, ".json") {
+ return saveJSON(pb)
+ }
+ return fmt.Errorf("unknown filetype '%s'", fullname)
+}
+
+func saveProto(pb proto.Message, fullname string) error {
+ if !strings.HasSuffix(fullname, ".pb") {
+ // todo: append .text here?
+ return fmt.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
+ }
+
+ 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, err := GetFilename(pb)
+ if err != nil {
+ return err
+ }
+ fullname = strings.TrimSpace(fullname)
+ if fullname == "" {
+ return fmt.Errorf("saveTEXT() pb.Filename was blank")
+ }
+
+ if !strings.HasSuffix(fullname, ".text") {
+ // todo: append .text here?
+ return fmt.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 := prototext.Format(pb)
+
+ err = configWrite(fullname, []byte(data))
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func saveJSON(pb proto.Message) error {
+ // get pb.Filename if it is there in the .proto file
+ fullname, err := GetFilename(pb)
+ if err != nil {
+ return err
+ }
+ if !strings.HasSuffix(fullname, ".text") {
+ // todo: append .text here?
+ return fmt.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"
+
+ err = configWrite(fullname, []byte(data))
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+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 {
+ return err
+ }
+ _, err = cfgfile.Write(data)
+ return err
+}