From b7b20f77240a53497c1715df1c940376393b0c19 Mon Sep 17 00:00:00 2001 From: Garet Halliday <me@garet.holiday> Date: Fri, 4 Aug 2023 17:38:46 -0500 Subject: [PATCH] arrays and numbers --- lib/util/ini/unmarshal.go | 51 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/util/ini/unmarshal.go b/lib/util/ini/unmarshal.go index de3dbd3f..c0fb0ccd 100644 --- a/lib/util/ini/unmarshal.go +++ b/lib/util/ini/unmarshal.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "reflect" + "strconv" "strings" ) @@ -72,7 +73,13 @@ outer: rv.Set(reflect.New(rv.Type().Elem())) } rv = rv.Elem() - case reflect.Struct, reflect.Map, reflect.String: + case reflect.Struct, + reflect.Map, + reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64, + reflect.Slice: break outer default: return errors.New("cannot set value of this type") @@ -94,9 +101,51 @@ outer: } } return nil + case reflect.Array: + items := strings.Split(value, ",") + if len(items) != rv.Len() { + return errors.New("wrong length for array") + } + for i, item := range items { + if err := set(rv.Index(i), strings.TrimSpace(item)); err != nil { + return err + } + } + return nil + case reflect.Slice: + items := strings.Split(value, ",") + slice := reflect.MakeSlice(rv.Type().Elem(), len(items), len(items)) + for i, item := range items { + if err := set(slice.Index(i), strings.TrimSpace(item)); err != nil { + return err + } + } + rv.Set(slice) + return nil case reflect.String: rv.SetString(value) return nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + v, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return err + } + rv.SetInt(v) + return nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + v, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return err + } + rv.SetUint(v) + return nil + case reflect.Float32, reflect.Float64: + v, err := strconv.ParseFloat(value, 64) + if err != nil { + return err + } + rv.SetFloat(v) + return nil default: panic("unreachable") } -- GitLab