diff options
author | Mike Crute <mike@crute.us> | 2022-11-20 21:49:24 -0800 |
---|---|---|
committer | Mike Crute <mike@crute.us> | 2022-11-20 21:49:24 -0800 |
commit | f65944a9718d0a9249080be9bd686ad7d11ad116 (patch) | |
tree | 903c1172223b6f2e5322bdff1ea3fac638071825 /os | |
parent | 52c9284f03a1731d163ee8dd68fdbc31a7253cb4 (diff) | |
download | golib-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.go | 118 |
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 @@ | |||
1 | package secrets | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "os" | ||
6 | "reflect" | ||
7 | "strconv" | ||
8 | ) | ||
9 | |||
10 | func 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 | |||
19 | func 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 | |||
28 | func 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 | |||
37 | func 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 | } | ||