Basic array table implementation

This commit is contained in:
Thomas Pelletier
2021-03-16 10:24:19 -04:00
parent c6892fcf5a
commit f9f9ccb777
5 changed files with 156 additions and 9 deletions
+27
View File
@@ -201,6 +201,19 @@ func scopeTarget(t target, name string) (target, error) {
return scope(x, name)
}
func scopeTableTarget(append bool, t target, name string) (target, error) {
x := t.get()
t, err := scope(x, name)
if err != nil {
return t, err
}
x = t.get()
if x.Kind() == reflect.Slice {
return scopeSlice(t, append)
}
return t, nil
}
func scope(v reflect.Value, name string) (target, error) {
switch v.Kind() {
case reflect.Struct:
@@ -218,6 +231,20 @@ func scope(v reflect.Value, name string) (target, error) {
}
}
func scopeSlice(t target, append bool) (target, error) {
v := t.get()
if append {
newElem := reflect.New(v.Type().Elem())
newSlice := reflect.Append(v, newElem.Elem())
err := t.set(newSlice)
if err != nil {
return t, err
}
v = t.get()
}
return valueTarget(v.Index(v.Len() - 1)), nil
}
func scopeMap(v reflect.Value, name string) (target, error) {
if v.IsNil() {
v.Set(reflect.MakeMap(v.Type()))