From ca8565de1f009796250cb957340fbf30477a1bc3 Mon Sep 17 00:00:00 2001 From: bcmmbaga Date: Thu, 15 Aug 2024 10:57:45 +0300 Subject: [PATCH] Refactor duplicate diff handling logic --- management/server/differs/nameserver.go | 48 +++++++++++++++---------- management/server/differs/route.go | 23 ++---------- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/management/server/differs/nameserver.go b/management/server/differs/nameserver.go index a190ddb5e..fdae9830e 100644 --- a/management/server/differs/nameserver.go +++ b/management/server/differs/nameserver.go @@ -20,28 +20,12 @@ func (d *NameServerComparator) Match(a, b reflect.Value) bool { } func (d *NameServerComparator) Diff(cl *diff.Changelog, path []string, a, b reflect.Value) error { - if a.Kind() == reflect.Invalid { - cl.Add(diff.CREATE, path, nil, b.Interface()) - return nil - } - if b.Kind() == reflect.Invalid { - cl.Add(diff.DELETE, path, a.Interface(), nil) - return nil + if err := handleInvalidKind(cl, path, a, b); err != nil { + return err } if a.Kind() == reflect.Slice && b.Kind() == reflect.Slice { - if a.Len() != b.Len() { - cl.Add(diff.UPDATE, append(path, "length"), a.Len(), b.Len()) - return nil - } - - for i := 0; i < min(a.Len(), b.Len()); i++ { - err := d.Diff(cl, append(path, fmt.Sprintf("[%d]", i)), a.Index(i), b.Index(i)) - if err != nil { - return err - } - } - return nil + return handleSliceKind(d, cl, path, a, b) } ns1, ok1 := a.Interface().(nbdns.NameServer) @@ -62,3 +46,29 @@ func (d *NameServerComparator) Diff(cl *diff.Changelog, path []string, a, b refl return nil } + +func handleInvalidKind(cl *diff.Changelog, path []string, a, b reflect.Value) error { + if a.Kind() == reflect.Invalid { + cl.Add(diff.CREATE, path, nil, b.Interface()) + return fmt.Errorf("invalid kind") + } + if b.Kind() == reflect.Invalid { + cl.Add(diff.DELETE, path, a.Interface(), nil) + return fmt.Errorf("invalid kind") + } + return nil +} + +func handleSliceKind(comparator diff.ValueDiffer, cl *diff.Changelog, path []string, a, b reflect.Value) error { + if a.Len() != b.Len() { + cl.Add(diff.UPDATE, append(path, "length"), a.Len(), b.Len()) + return nil + } + + for i := 0; i < min(a.Len(), b.Len()); i++ { + if err := comparator.Diff(cl, append(path, fmt.Sprintf("[%d]", i)), a.Index(i), b.Index(i)); err != nil { + return err + } + } + return nil +} diff --git a/management/server/differs/route.go b/management/server/differs/route.go index 7d6efaf64..95eb08882 100644 --- a/management/server/differs/route.go +++ b/management/server/differs/route.go @@ -21,29 +21,12 @@ func (d *RouteComparator) Match(a, b reflect.Value) bool { } func (d *RouteComparator) Diff(cl *diff.Changelog, path []string, a, b reflect.Value) error { - if a.Kind() == reflect.Invalid { - cl.Add(diff.CREATE, path, nil, b.Interface()) - return nil - } - if b.Kind() == reflect.Invalid { - cl.Add(diff.DELETE, path, a.Interface(), nil) - return nil + if err := handleInvalidKind(cl, path, a, b); err != nil { + return err } - // Handle slice comparison if a.Kind() == reflect.Slice && b.Kind() == reflect.Slice { - if a.Len() != b.Len() { - cl.Add(diff.UPDATE, append(path, "length"), a.Len(), b.Len()) - return nil - } - - for i := 0; i < min(a.Len(), b.Len()); i++ { - err := d.Diff(cl, append(path, fmt.Sprintf("[%d]", i)), a.Index(i), b.Index(i)) - if err != nil { - return err - } - } - return nil + return handleSliceKind(d, cl, path, a, b) } route1, ok1 := a.Interface().(*nbroute.Route)