aboutsummaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorMike Crute <mike@crute.us>2022-11-20 21:49:24 -0800
committerMike Crute <mike@crute.us>2022-11-20 21:49:24 -0800
commitf65944a9718d0a9249080be9bd686ad7d11ad116 (patch)
tree903c1172223b6f2e5322bdff1ea3fac638071825 /os
parent52c9284f03a1731d163ee8dd68fdbc31a7253cb4 (diff)
downloadgolib-f65944a9718d0a9249080be9bd686ad7d11ad116.tar.bz2
golib-f65944a9718d0a9249080be9bd686ad7d11ad116.tar.xz
golib-f65944a9718d0a9249080be9bd686ad7d11ad116.zip
os: add env struct reflectorv0.4.0
Diffstat (limited to 'os')
-rw-r--r--os/reflective_env.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/os/reflective_env.go b/os/reflective_env.go
new file mode 100644
index 0000000..60f15e4
--- /dev/null
+++ b/os/reflective_env.go
@@ -0,0 +1,118 @@
1package secrets
2
3import (
4 "fmt"
5 "os"
6 "reflect"
7 "strconv"
8)
9
10func parseSetInt[T int | int8 | int16 | int32 | int64](f reflect.Value, v string, size int) error {
11 iv, err := strconv.ParseInt(v, 0, size)
12 if err != nil {
13 return err
14 }
15 f.Set(reflect.ValueOf(T(iv)))
16 return nil
17}
18
19func parseSetUint[T uint | uint8 | uint16 | uint32 | uint64](f reflect.Value, v string, size int) error {
20 iv, err := strconv.ParseUint(v, 0, size)
21 if err != nil {
22 return err
23 }
24 f.Set(reflect.ValueOf(T(iv)))
25 return nil
26}
27
28func parseSetFloat[T float32 | float64](f reflect.Value, v string, size int) error {
29 iv, err := strconv.ParseFloat(v, size)
30 if err != nil {
31 return err
32 }
33 f.Set(reflect.ValueOf(T(iv)))
34 return nil
35}
36
37func UnmarshalEnvironment(into any) error {
38 t := reflect.TypeOf(into).Elem()
39 o := reflect.ValueOf(into).Elem()
40
41 for i := 0; i < t.NumField(); i++ {
42 tf := t.Field(i)
43 f := o.FieldByName(tf.Name)
44
45 envName := tf.Tag.Get("env")
46 if envName == "" {
47 continue
48 }
49
50 envValue, ok := os.LookupEnv(envName)
51 if !ok {
52 continue
53 }
54
55 switch typ := f.Type().Kind(); typ {
56 case reflect.Bool:
57 b, err := strconv.ParseBool(envValue)
58 if err != nil {
59 return err
60 }
61 f.Set(reflect.ValueOf(b))
62 case reflect.String:
63 f.Set(reflect.ValueOf(envValue))
64 case reflect.Int:
65 if err := parseSetInt[int](f, envValue, 64); err != nil {
66 return err
67 }
68 case reflect.Int8:
69 if err := parseSetInt[int8](f, envValue, 8); err != nil {
70 return err
71 }
72 case reflect.Int16:
73 if err := parseSetInt[int16](f, envValue, 16); err != nil {
74 return err
75 }
76 case reflect.Int32:
77 if err := parseSetInt[int32](f, envValue, 32); err != nil {
78 return err
79 }
80 case reflect.Int64:
81 if err := parseSetInt[int64](f, envValue, 64); err != nil {
82 return err
83 }
84 case reflect.Uint:
85 if err := parseSetUint[uint](f, envValue, 64); err != nil {
86 return err
87 }
88 case reflect.Uint8:
89 if err := parseSetUint[uint8](f, envValue, 8); err != nil {
90 return err
91 }
92 case reflect.Uint16:
93 if err := parseSetUint[uint16](f, envValue, 16); err != nil {
94 return err
95 }
96 case reflect.Uint32:
97 if err := parseSetUint[uint32](f, envValue, 32); err != nil {
98 return err
99 }
100 case reflect.Uint64:
101 if err := parseSetUint[uint64](f, envValue, 64); err != nil {
102 return err
103 }
104 case reflect.Float32:
105 if err := parseSetFloat[float32](f, envValue, 32); err != nil {
106 return err
107 }
108 case reflect.Float64:
109 if err := parseSetFloat[float64](f, envValue, 64); err != nil {
110 return err
111 }
112 default:
113 return fmt.Errorf("UnmarshalEnvironment: unabled to handle type: %s", typ)
114 }
115 }
116
117 return nil
118}