-
Notifications
You must be signed in to change notification settings - Fork 204
/
utils.go
136 lines (108 loc) · 2.92 KB
/
utils.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
// Package utils [general utility functions for the db1000n app]
package utils
import (
"fmt"
"log"
"os"
"os/exec"
"runtime"
"strconv"
"time"
"github.com/mitchellh/mapstructure"
"go.uber.org/zap"
"gopkg.in/yaml.v3"
)
// PanicHandler just stub it in the beginning of every major module invocation to prevent single module failure from crashing the whole app
func PanicHandler(logger *zap.Logger) {
if err := recover(); err != nil {
logger.Error("caught panic", zap.Any("err", err))
}
}
// GetEnvStringDefault returns environment variable or default value if no env varible is present
func GetEnvStringDefault(key, defaultValue string) string {
value, ok := os.LookupEnv(key)
if !ok {
return defaultValue
}
return value
}
// GetEnvIntDefault returns environment variable or default value if no env varible is present
func GetEnvIntDefault(key string, defaultValue int) int {
value, ok := os.LookupEnv(key)
if !ok {
return defaultValue
}
v, err := strconv.Atoi(value)
if err != nil {
log.Printf("GetEnvIntDefault[%s]: %v", key, err)
return defaultValue
}
return v
}
// GetEnvBoolDefault returns environment variable or default value if no env varible is present
func GetEnvBoolDefault(key string, defaultValue bool) bool {
value, ok := os.LookupEnv(key)
if !ok {
return defaultValue
}
v, err := strconv.ParseBool(value)
if err != nil {
log.Printf("GetEnvBoolDefault[%s]: %v", key, err)
return defaultValue
}
return v
}
// GetEnvDurationDefault returns environment variable or default value if no env varible is present
func GetEnvDurationDefault(key string, defaultValue time.Duration) time.Duration {
value, ok := os.LookupEnv(key)
if !ok {
return defaultValue
}
v, err := time.ParseDuration(value)
if err != nil {
log.Printf("GetEnvBoolDefault[%s]: %v", key, err)
return defaultValue
}
return v
}
func NonNilDurationOrDefault(d *time.Duration, dflt time.Duration) time.Duration {
if d != nil {
return *d
}
return dflt
}
func NonNilIntOrDefault(i *int, dflt int) int {
if i != nil {
return *i
}
return dflt
}
// Decode is an alias to a mapstructure.NewDecoder({Squash: true}).Decode()
func Decode(input interface{}, output interface{}) error {
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{Squash: true, WeaklyTypedInput: true, Result: output})
if err != nil {
log.Printf("Error parsing job config: %v", err)
return err
}
return decoder.Decode(input)
}
func Unmarshal(input []byte, output interface{}, format string) error {
switch format {
case "", "json", "yaml":
if err := yaml.Unmarshal(input, output); err != nil {
return err
}
default:
return fmt.Errorf("unknown config format: %v", format)
}
return nil
}
func openBrowser(url string) {
switch runtime.GOOS {
case "windows":
_ = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
_ = exec.Command("open", url).Start()
}
log.Printf("Please open %s", url)
}