-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenv.go
119 lines (96 loc) · 2.93 KB
/
env.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
package env // Permite gestionar una lista de variables de entorno.
import (
"fmt"
"os"
"reflect"
"strconv"
"strings"
)
const (
// ValidOk valor revisado y confirmado.
ValidOk = iota
// ValidRequiredValue la variable de entorno no ha sido definida.
ValidRequiredValue
// ValidWrongValue la variable fue definida con un valor incorrecto.
ValidWrongValue
)
// -----------------------------------------------------------------------------
// Result estructura que informa la validación de cada una de las variables de entorno.
type Result struct {
// Status resultado obtenido: ValidOk, ValidRequiredValue, ValidWrongValue.
Status int
// EnvValue el valor original obtenido.
EnvValue string
// Error el error detectado al intentar obtener el valor.
Error error
}
// -----------------------------------------------------------------------------
// EnvironmentVarsHandler objeto para la gestión de variables de entorno.
type EnvironmentVarsHandler struct {
// Results el mapa de variables obtenidas.
Results map[string]Result
conf *interface{}
}
// Valid verifica una o más variables de entorno.
func (evh *EnvironmentVarsHandler) Valid() bool {
evh.Results = make(map[string]Result)
dataStruct := reflect.ValueOf(*evh.conf).Elem()
validated := true
for i := 0; i < dataStruct.NumField(); i++ {
property := dataStruct.Type().Field(i)
name := property.Tag.Get("name")
if name == "" {
name = property.Name
}
for _, e := range strings.Split(name, ",") {
var valueError error
status := ValidOk
value := os.Getenv(e)
if value != "" {
switch property.Type.String() {
case "string":
dataStruct.Field(i).SetString(value)
status = ValidOk
valueError = nil
case "int":
if realValue, err := strconv.ParseInt(value, 10, 64); err == nil {
dataStruct.Field(i).SetInt(realValue)
} else {
status = ValidWrongValue
valueError = err
}
case "float":
if realValue, err := strconv.ParseFloat(value, 32); err == nil {
dataStruct.Field(i).SetFloat(realValue)
} else {
status = ValidWrongValue
valueError = err
}
case "bool":
if realValue, err := strconv.ParseBool(value); err == nil {
dataStruct.Field(i).SetBool(realValue)
} else {
status = ValidWrongValue
valueError = err
}
default:
status = ValidWrongValue
valueError = fmt.Errorf("Wrong value (%s=\"%s\")", property.Name, value)
}
} else {
status = ValidRequiredValue
valueError = fmt.Errorf("Required value (%s)", property.Name)
}
evh.Results[property.Name] = Result{status, value, valueError}
if status != ValidOk && validated {
validated = false
}
}
}
return validated
}
// -----------------------------------------------------------------------------
// New retorna un objeto EnvironmentVarsHandler.
func New(confVars interface{}) *EnvironmentVarsHandler {
return &EnvironmentVarsHandler{conf: &confVars}
}