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)