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