/
fields.go
78 lines (61 loc) · 1.46 KB
/
fields.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
package envgen
import (
"go/ast"
"strings"
)
func parseFields(fieldsList []*ast.Field) []Env {
envs := make([]Env, 0, len(fieldsList))
for _, field := range fieldsList {
switch v := field.Type.(type) {
case *ast.Ident:
case *ast.SelectorExpr:
case *ast.ArrayType:
case *ast.StructType:
envs = append(envs, parseFields(v.Fields.List)...)
continue
}
if field.Tag == nil {
continue
}
env, ok := parseEnvFromTagsString(field.Tag.Value)
if !ok {
continue
}
if field.Doc != nil {
docList := field.Doc.List
for _, doc := range docList {
line := strings.TrimSpace(strings.TrimPrefix(doc.Text, "//"))
env.description = append(env.description, line)
}
}
envs = append(envs, env)
}
return envs
}
func parseEnvFromTagsString(tagsString string) (Env, bool) {
var env Env
tagStrings := strings.Fields(tagsString[1 : len(tagsString)-1])
for _, tagString := range tagStrings {
delimiter := strings.Index(tagString, ":")
if delimiter == -1 {
return env, false
}
tagKey := tagString[:delimiter]
tagValues := strings.Split(tagString[delimiter+2:len(tagString)-1], ",")
if len(tagValues) == 0 {
return env, false
}
switch tagKey {
case "env":
env.name = tagValues[0]
env.mandatory = contains(tagValues, "required")
case "envDefault":
env.defaultValue = tagValues[0]
case "envSeparator":
env.separator = tagValues[0]
case "envExample":
env.separator = tagValues[0]
}
}
return env, true
}