-
Notifications
You must be signed in to change notification settings - Fork 0
/
conf.go
132 lines (114 loc) · 3.08 KB
/
conf.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
package easyconf
// import "path/filepath"
import (
"fmt"
"os"
"strings"
)
type Conf struct {
files []string
items []*ConfItem
}
// NewConf 定义配置文件。留空默认为: .env, default.env
func NewConf(files ...string) *Conf {
defaultFiles := []string{".env", "default.env"}
if len(files) == 0 {
files = defaultFiles
}
for _, ff := range files {
if ff == "" {
panic("配置文件路径不能为空")
}
}
return &Conf{files: files}
}
func (cf *Conf) StringVar(pval *string, name string, defval, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) BoolVar(pval *bool, name string, defval bool, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) IntVar(pval *int, name string, defval int, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) StringListVar(pval *[]string, name string, defval []string, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) IntListVar(pval *[]int, name string, defval []int, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) Float64Var(pval *float64, name string, defval float64, title string, usage ...string) {
*pval = defval
cf.addItem(pval, name, defval, title, usage...)
}
func (cf *Conf) AddComment(title string, comment ...string) {
cf.addItem(nil, "", nil, title, comment...)
}
func (cf *Conf) addItem(pval any, name string, defval any, title string, usage ...string) {
cf.items = append(cf.items, newConfItem(pval, name, defval, title, usage...))
}
func (cf *Conf) setItemVar(k, v string) error {
var err error
for _, arg := range cf.items {
if arg.Name == "" {
// 注释语句 Name 为空字符
continue
}
if arg.Name == k {
err1 := arg.setValueVar(v)
if err1 != nil {
err = err1
}
}
}
return err
}
func (cf Conf) DefaultString() string {
var result []string
for _, item := range cf.items {
result = append(result, item.DefaultString())
}
return strings.Join(result, "\n\n")
}
func (cf Conf) String() string {
var result []string
for _, item := range cf.items {
result = append(result, item.String())
}
return strings.Join(result, "\n\n")
}
func (cf *Conf) UpdateFile(fpath string) error {
var f *os.File
var err error
if fpath == "" {
fpath = cf.files[0]
}
f, err = os.OpenFile(fpath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
if err != nil {
return fmt.Errorf("open file(%s)err(%v)", fpath, err)
}
_, err = f.WriteString(cf.String())
if err != nil {
return fmt.Errorf("write file(%s)err(%v)", fpath, err)
}
return f.Close()
}
func createEnvFile(fpath, content string) error {
if fpath == "" {
return fmt.Errorf("createEnvFile empty file")
}
f, err := os.Create(fpath)
if err != nil {
return fmt.Errorf("create env file(%s)err(%v)", fpath, err)
}
_, err = f.WriteString(content)
if err != nil {
return fmt.Errorf("write env file(%s)err(%v)", fpath, err)
}
return f.Close()
}