From 26f103473c289a66c60b2866657789d3e8088e46 Mon Sep 17 00:00:00 2001 From: Maisem Ali Date: Tue, 12 Jul 2022 23:45:37 -0700 Subject: [PATCH] cmd/viewer: add support for map of structs without pointers This adds support for fields like `map[string]netaddr.IPPrefix`. Signed-off-by: Maisem Ali --- cmd/viewer/tests/tests.go | 7 ++++--- cmd/viewer/tests/tests_clone.go | 23 +++++++++++++++-------- cmd/viewer/tests/tests_view.go | 17 +++++++++++------ cmd/viewer/viewer.go | 9 +++++++++ 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/cmd/viewer/tests/tests.go b/cmd/viewer/tests/tests.go index b2f704c5f..cd099362a 100644 --- a/cmd/viewer/tests/tests.go +++ b/cmd/viewer/tests/tests.go @@ -20,13 +20,14 @@ type StructWithoutPtrs struct { type Map struct { Int map[string]int SliceInt map[string][]int - StructWithPtr map[string]*StructWithPtrs - StructWithoutPtr map[string]*StructWithoutPtrs + StructPtrWithPtr map[string]*StructWithPtrs + StructPtrWithoutPtr map[string]*StructWithoutPtrs + StructWithoutPtr map[string]StructWithoutPtrs SlicesWithPtrs map[string][]*StructWithPtrs SlicesWithoutPtrs map[string][]*StructWithoutPtrs StructWithoutPtrKey map[StructWithoutPtrs]int `json:"-"` - // Unsupported. + // Unsupported views. SliceIntPtr map[string][]*int PointerKey map[*string]int `json:"-"` StructWithPtrKey map[StructWithPtrs]int `json:"-"` diff --git a/cmd/viewer/tests/tests_clone.go b/cmd/viewer/tests/tests_clone.go index 0da1be798..dddb7b1d9 100644 --- a/cmd/viewer/tests/tests_clone.go +++ b/cmd/viewer/tests/tests_clone.go @@ -73,16 +73,22 @@ func (src *Map) Clone() *Map { dst.SliceInt[k] = append([]int{}, src.SliceInt[k]...) } } - if dst.StructWithPtr != nil { - dst.StructWithPtr = map[string]*StructWithPtrs{} - for k, v := range src.StructWithPtr { - dst.StructWithPtr[k] = v.Clone() + if dst.StructPtrWithPtr != nil { + dst.StructPtrWithPtr = map[string]*StructWithPtrs{} + for k, v := range src.StructPtrWithPtr { + dst.StructPtrWithPtr[k] = v.Clone() + } + } + if dst.StructPtrWithoutPtr != nil { + dst.StructPtrWithoutPtr = map[string]*StructWithoutPtrs{} + for k, v := range src.StructPtrWithoutPtr { + dst.StructPtrWithoutPtr[k] = v.Clone() } } if dst.StructWithoutPtr != nil { - dst.StructWithoutPtr = map[string]*StructWithoutPtrs{} + dst.StructWithoutPtr = map[string]StructWithoutPtrs{} for k, v := range src.StructWithoutPtr { - dst.StructWithoutPtr[k] = v.Clone() + dst.StructWithoutPtr[k] = v } } if dst.SlicesWithPtrs != nil { @@ -128,8 +134,9 @@ func (src *Map) Clone() *Map { var _MapCloneNeedsRegeneration = Map(struct { Int map[string]int SliceInt map[string][]int - StructWithPtr map[string]*StructWithPtrs - StructWithoutPtr map[string]*StructWithoutPtrs + StructPtrWithPtr map[string]*StructWithPtrs + StructPtrWithoutPtr map[string]*StructWithoutPtrs + StructWithoutPtr map[string]StructWithoutPtrs SlicesWithPtrs map[string][]*StructWithPtrs SlicesWithoutPtrs map[string][]*StructWithoutPtrs StructWithoutPtrKey map[StructWithoutPtrs]int diff --git a/cmd/viewer/tests/tests_view.go b/cmd/viewer/tests/tests_view.go index 4d0cd8ce1..3261d927f 100644 --- a/cmd/viewer/tests/tests_view.go +++ b/cmd/viewer/tests/tests_view.go @@ -196,18 +196,22 @@ func (v MapView) SliceInt() views.MapFn[string, []int, views.Slice[int]] { }) } -func (v MapView) StructWithPtr() views.MapFn[string, *StructWithPtrs, StructWithPtrsView] { - return views.MapFnOf(v.ж.StructWithPtr, func(t *StructWithPtrs) StructWithPtrsView { +func (v MapView) StructPtrWithPtr() views.MapFn[string, *StructWithPtrs, StructWithPtrsView] { + return views.MapFnOf(v.ж.StructPtrWithPtr, func(t *StructWithPtrs) StructWithPtrsView { return t.View() }) } -func (v MapView) StructWithoutPtr() views.MapFn[string, *StructWithoutPtrs, StructWithoutPtrsView] { - return views.MapFnOf(v.ж.StructWithoutPtr, func(t *StructWithoutPtrs) StructWithoutPtrsView { +func (v MapView) StructPtrWithoutPtr() views.MapFn[string, *StructWithoutPtrs, StructWithoutPtrsView] { + return views.MapFnOf(v.ж.StructPtrWithoutPtr, func(t *StructWithoutPtrs) StructWithoutPtrsView { return t.View() }) } +func (v MapView) StructWithoutPtr() views.Map[string, StructWithoutPtrs] { + return views.MapOf(v.ж.StructWithoutPtr) +} + func (v MapView) SlicesWithPtrs() views.MapFn[string, []*StructWithPtrs, views.SliceView[*StructWithPtrs, StructWithPtrsView]] { return views.MapFnOf(v.ж.SlicesWithPtrs, func(t []*StructWithPtrs) views.SliceView[*StructWithPtrs, StructWithPtrsView] { return views.SliceOfViews[*StructWithPtrs, StructWithPtrsView](t) @@ -231,8 +235,9 @@ func (v MapView) StructWithPtrKey() map[StructWithPtrs]int { panic("unsupported" var _MapViewNeedsRegeneration = Map(struct { Int map[string]int SliceInt map[string][]int - StructWithPtr map[string]*StructWithPtrs - StructWithoutPtr map[string]*StructWithoutPtrs + StructPtrWithPtr map[string]*StructWithPtrs + StructPtrWithoutPtr map[string]*StructWithoutPtrs + StructWithoutPtr map[string]StructWithoutPtrs SlicesWithPtrs map[string][]*StructWithPtrs SlicesWithoutPtrs map[string][]*StructWithoutPtrs StructWithoutPtrKey map[StructWithoutPtrs]int diff --git a/cmd/viewer/viewer.go b/cmd/viewer/viewer.go index a8fb49cc3..a156bf375 100644 --- a/cmd/viewer/viewer.go +++ b/cmd/viewer/viewer.go @@ -224,6 +224,15 @@ func genView(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named, thi mElem := m.Elem() var template string switch u := mElem.(type) { + case *types.Struct, *types.Named: + strucT := u + args.FieldType = it.QualifiedName(fieldType) + if codegen.ContainsPointers(strucT) { + writeTemplate("unsupportedField") + continue + } + template = "mapField" + args.MapValueType = it.QualifiedName(mElem) case *types.Basic: template = "mapField" args.MapValueType = it.QualifiedName(mElem)