master
go 68 lines 1.43 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package envx
4
5 import (
6 "fmt"
7 "os"
8 "regexp"
9 "strings"
10 )
11
12 var reEnvVarID = regexp.MustCompile(`^[A-Za-z_][A-Za-z0-9_]*$`)
13
14 func Lookup(name string) (string, bool) {
15 v, ok := os.LookupEnv(name)
16 if !ok {
17 return "", false
18 }
19 return strings.TrimSpace(v), true
20 }
21
22 func ResolveRequired(selector, fieldPath string) (string, error) {
23 selector = strings.TrimSpace(selector)
24 if selector == "" {
25 return "", fmt.Errorf("%s selector is empty", fieldPath)
26 }
27 val, ok := Lookup(selector)
28 if !ok || strings.TrimSpace(val) == "" {
29 return "", fmt.Errorf("%s references env '%s' which is not set", fieldPath, selector)
30 }
31 return strings.TrimSpace(val), nil
32 }
33
34 func ResolveOptional(selector string) (string, bool) {
35 selector = strings.TrimSpace(selector)
36 if selector == "" {
37 return "", false
38 }
39 val, ok := Lookup(selector)
40 if !ok || strings.TrimSpace(val) == "" {
41 return "", false
42 }
43 return strings.TrimSpace(val), true
44 }
45
46 func ValidateSelector(name, fieldPath string) error {
47 name = strings.TrimSpace(name)
48 if name == "" {
49 return fmt.Errorf("%s is required", fieldPath)
50 }
51 if !reEnvVarID.MatchString(name) {
52 return fmt.Errorf("%s must reference an environment variable name", fieldPath)
53 }
54 return nil
55 }
56
57 func ParseBool(name string) bool {
58 v, ok := Lookup(name)
59 if !ok {
60 return false
61 }
62 switch strings.ToLower(strings.TrimSpace(v)) {
63 case "1", "true", "yes":
64 return true
65 default:
66 return false
67 }
68 }