58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package hw08_zenv_to_structure //nolint:golint,stylecheck
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"reflect"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func Slice2struct(mp []string, str interface{}) error {
|
|
v := reflect.ValueOf(str)
|
|
if v.Kind() != reflect.Ptr {
|
|
return fmt.Errorf("%T is not a pointer", str)
|
|
}
|
|
v = v.Elem()
|
|
if v.Kind() != reflect.Struct {
|
|
return fmt.Errorf("%T is not a pointer to struct", str)
|
|
}
|
|
|
|
for _, e := range mp {
|
|
st := strings.Split(e, "=")
|
|
var key string = st[0]
|
|
var value interface{} = st[1]
|
|
f := v.FieldByName(key)
|
|
if f.IsValid() && f.CanSet() {
|
|
switch v := f.Interface().(type) {
|
|
case int:
|
|
val, err := strconv.Atoi(value.(string))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
x := int64(val)
|
|
if !f.OverflowInt(x) {
|
|
f.SetInt(x)
|
|
}
|
|
case string:
|
|
f.SetString(value.(string))
|
|
case bool:
|
|
f.SetBool(value.(string) == "true")
|
|
case []interface{}:
|
|
input := reflect.ValueOf(value)
|
|
f.Set(input)
|
|
default:
|
|
return fmt.Errorf("i don't know how to parse type %T", v)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Env2struct(s interface{}) {
|
|
env := os.Environ()
|
|
if err := Slice2struct(env, s); err != nil {
|
|
log.Fatal("ошибка", err.Error())
|
|
}
|
|
}
|