summaryrefslogtreecommitdiff
path: root/save.go
blob: 43e40441694203d6ed0bd2a160ef2adaf95c318d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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)
}
*/