/
data2file.go
205 lines (179 loc) · 4.94 KB
/
data2file.go
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package util
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"io/ioutil"
"os"
"path"
"sort"
"strings"
"sync"
)
const (
F_ENV = "env"
F_INI = "ini"
F_PHP = "php"
F_YAML = "yaml"
F_YML = "yml"
F_XML = "xml"
F_TXT = "txt"
)
const (
FilePerm = 0644
)
func NSSyntax(namespace string) string {
syntax := path.Ext(namespace)
if syntax != "" {
syntax = strings.Trim(syntax, ".")
}
switch strings.ToLower(syntax) {
case F_ENV, F_INI, F_PHP, F_YAML, F_YML, F_XML, F_TXT:
return strings.ToLower(syntax)
default:
return F_ENV
}
}
// SingleNSInOneFile 将单独一个NS配置数据写入一个文件
func SingleNSInOneFile(fileName, suffix string, data map[string]string) error {
var content string
switch strings.ToLower(suffix) {
case F_ENV, F_INI:
content, _ = Marshal(data)
case F_PHP:
content = "<?php\n\nreturn " + GoTypeToPHPCode(data) + ";\n"
case F_YAML, F_YML, F_XML, F_TXT:
content = data["content"]
}
return WriteFile(fileName, content, FilePerm)
}
// MultiNSInOneFile 将多个NS配置数据写入到一个文件中
func MultiNSInOneFile(fileName, suffix string, nss []string, multiData map[string]map[string]string) error {
var content string
switch strings.ToLower(suffix) {
case F_ENV:
content = multiDataToDotENV(multiData, nss)
case F_INI:
content = multiDataToINI(multiData, nss)
case F_PHP:
content = multiDataToPHP(multiData, nss)
case F_YAML, F_YML, F_XML, F_TXT:
content = multiDataToTXT(multiData, nss)
}
return WriteFile(fileName, content, FilePerm)
}
// WriteFile 将内容写入文件
func WriteFile(filename, content string, perm os.FileMode) error {
var m sync.Mutex
m.Lock()
defer m.Unlock()
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
if err != nil {
return err
}
defer file.Close()
_, err = file.WriteString(content)
if err != nil {
return err
}
_ = file.Sync()
return err
}
// multiDataToDotENV 配置数据转换为dotEnv内容
func multiDataToDotENV(multiData map[string]map[string]string, nss []string) string {
content := make([]string, 0)
// 遍历配置数据,拼接配置文件内容
for _, namespace := range nss {
if data, ok := multiData[namespace]; ok {
sortKeys := make([]string, 0, len(data))
for k := range data {
sortKeys = append(sortKeys, k)
}
sort.Strings(sortKeys) // 进行key自然升序
// 写一行注释,提高.env文件可读性,用于快速区分namespace配置区块
content = append(content, "###"+trimNSSuffix(namespace)+"###")
for _, key := range sortKeys {
content = append(content, fmt.Sprintf(`%s=%s`, key, data[key]))
}
content = append(content, "\n") //增加一个换行进行区分
}
}
return strings.Join(content, "\n")
}
// multiDataToINI 配置数据转换为ini内容
func multiDataToINI(multiData map[string]map[string]string, nss []string) string {
content := make([]string, 0)
// 遍历配置数据,拼接配置文件内容
for _, namespace := range nss {
if data, ok := multiData[namespace]; ok {
sortKeys := make([]string, 0, len(data))
for k := range data {
sortKeys = append(sortKeys, k)
}
sort.Strings(sortKeys) // 进行key自然升序
// 根据namespace分配置区块
content = append(content, "["+trimNSSuffix(namespace)+"]")
for _, key := range sortKeys {
content = append(content, fmt.Sprintf(`%s=%s`, key, data[key]))
}
content = append(content, "\n") //增加一个换行进行区分
}
}
return strings.Join(content, "\n")
}
// multiDataToPHP 配置数据转换为ini内容
func multiDataToPHP(multiData map[string]map[string]string, nss []string) string {
content := make(map[string]map[string]string)
for _, namespace := range nss {
if data, ok := multiData[namespace]; ok {
content[trimNSSuffix(namespace)] = data
}
}
return "<?php\n\nreturn " + GoTypeToPHPCode(content) + ";\n"
}
// multiDataToTXT 配置数据转换为txt内容
func multiDataToTXT(multiData map[string]map[string]string, nss []string) string {
content := make([]string, 0)
for _, namespace := range nss {
if data, ok := multiData[namespace]; ok {
if row, ok := data["content"]; ok {
content = append(content, row)
}
}
}
return strings.Join(content, "\n")
}
// trimNSSuffix 切除namespace后缀
func trimNSSuffix(namespace string) string {
ns := strings.Split(namespace, ".")
if len(ns) > 0 {
return ns[0]
} else {
return namespace
}
}
// HashFileMd5 获取文件md5值
func HashFileMd5(filePath string) (string, error) {
var md5Sum string
file, err := os.Open(filePath)
if err != nil {
return md5Sum, err
}
defer file.Close()
hash := md5.New()
if _, err := io.Copy(hash, file); err != nil {
return md5Sum, err
}
hashInBytes := hash.Sum(nil)[:16]
md5Sum = hex.EncodeToString(hashInBytes)
return md5Sum, nil
}
// CopyFile 复制文件
func CopyFile(sourceFile, toNewFile string) error {
input, err := ioutil.ReadFile(sourceFile)
if err != nil {
return err
}
return WriteFile(toNewFile, string(input), FilePerm)
}