-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnormalizer.go
102 lines (76 loc) · 2.3 KB
/
normalizer.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
package confusing
import (
"fmt"
"os"
"strings"
)
const (
SnakeCaseConvention = "snake"
CamelCaseConvention = "camel"
UpperSnakeCaseConvention = "upper_snake"
)
var normalizers = map[string]KeyNormalizer{
SnakeCaseConvention: &SnakeCaseNormalizer{},
CamelCaseConvention: &CamelCaseNormalizer{},
UpperSnakeCaseConvention: &UpperSnakeCaseNormalizer{},
}
var sourceConventions = map[string]string{
EnvSourceType: UpperSnakeCaseConvention,
YAMLSourceType: SnakeCaseConvention,
JSONSourceType: CamelCaseConvention,
}
type UnknownConventionError struct {
Convention string
}
func (u UnknownConventionError) Error() string {
return fmt.Sprintf("unknown convention: %s", u.Convention)
}
type KeyNormalizer interface {
Normalize(key string) string
}
type SnakeCaseNormalizer struct{}
func (n *SnakeCaseNormalizer) Normalize(key string) string {
return camelToSnake(key, true)
}
type UpperSnakeCaseNormalizer struct{}
// Normalize todo: Optimize this process
func (n *UpperSnakeCaseNormalizer) Normalize(key string) string {
parts := strings.Split(key, ".")
for i, part := range parts {
parts[i] = strings.ToUpper(camelToSnake(part, false))
}
key = strings.Join(parts, "_")
return key
}
type CamelCaseNormalizer struct{}
func (n *CamelCaseNormalizer) Normalize(key string) string {
parts := strings.Split(key, ".")
for i, part := range parts {
parts[i] = lcfirst(part)
}
return strings.Join(parts, ".")
}
func SetConventionForSourceType(sourceType SourceType, convention string) {
sourceConventions[sourceType] = convention
}
func GetNormalizer(convention string) KeyNormalizer {
return normalizers[convention]
}
func GetConventionForSourceType(sourceType SourceType) string {
convention := sourceConventions[sourceType]
conventionEnvVar := fmt.Sprintf("%s_CONVENTION", strings.ToUpper(sourceType))
return stringOrDefault(os.Getenv(conventionEnvVar), convention)
}
func NormalizerForSourceType(convention string, sourceType SourceType) (KeyNormalizer, error) {
var normalizer KeyNormalizer
if len(convention) > 0 {
normalizer = GetNormalizer(convention)
} else {
convention = GetConventionForSourceType(sourceType)
normalizer = GetNormalizer(convention)
}
if normalizer == nil {
return nil, UnknownConventionError{Convention: convention}
}
return normalizer, nil
}