diff --git a/context.go b/context.go index 5c8df51bb..c574be7d2 100644 --- a/context.go +++ b/context.go @@ -92,6 +92,7 @@ func (ctx *Context) OnCancel(f func()) { // // json.RawMessage => interface{} // []json.RawMessage => []interface{} +// [][]json.RawMessage => [][]interface{} // map[string]json.RawMessage => map[string]interface{} // []map[string]json.RawMessage => []map[string]interface{} // @@ -179,6 +180,27 @@ func (ctx Context) LoadModule(structPointer interface{}, fieldName string) (inte } result = all + } else if typ.Elem().Kind() == reflect.Slice && isJSONRawMessage(typ.Elem().Elem()) { + // val is `[][]json.RawMessage` + + if inlineModuleKey == "" { + panic("unable to determine module name without inline_key because type is not a ModuleMap") + } + var all [][]interface{} + for i := 0; i < val.Len(); i++ { + innerVal := val.Index(i) + var allInner []interface{} + for j := 0; j < innerVal.Len(); j++ { + innerInnerVal, err := ctx.loadModuleInline(inlineModuleKey, moduleNamespace, innerVal.Index(j).Interface().(json.RawMessage)) + if err != nil { + return nil, fmt.Errorf("position %d: %v", j, err) + } + allInner = append(allInner, innerInnerVal) + } + all = append(all, allInner) + } + result = all + } else if isModuleMapType(typ.Elem()) { // val is `[]map[string]json.RawMessage`