feat: add precise diagnostics and optional client copy logging controls
This commit is contained in:
@@ -89,12 +89,14 @@ type visit struct {
|
||||
target reflect.Type
|
||||
}
|
||||
type state struct {
|
||||
options *settings
|
||||
seen map[visit]reflect.Value
|
||||
graph *graph
|
||||
nodes int
|
||||
allocated uint64
|
||||
valueRoot *reference
|
||||
options *settings
|
||||
seen map[visit]reflect.Value
|
||||
graph *graph
|
||||
nodes int
|
||||
allocated uint64
|
||||
valueRoot *reference
|
||||
checkedTypes map[pair]bool
|
||||
checkedNodes int
|
||||
}
|
||||
|
||||
func (s *state) reserve(count int, size uintptr, path string) error {
|
||||
@@ -239,6 +241,11 @@ func (s *state) walk(src, base reflect.Value, t reflect.Type, path string, depth
|
||||
case reflect.Struct:
|
||||
return s.structure(src, base, t, path, depth)
|
||||
case reflect.Slice:
|
||||
if src.Len() == 0 {
|
||||
if err := s.checkAbsent(src.Type(), t, path); err != nil {
|
||||
return reflect.Value{}, err
|
||||
}
|
||||
}
|
||||
if !s.options.deep && src.Type() == t {
|
||||
return src, nil
|
||||
}
|
||||
@@ -264,6 +271,11 @@ func (s *state) walk(src, base reflect.Value, t reflect.Type, path string, depth
|
||||
}
|
||||
return out, nil
|
||||
case reflect.Array:
|
||||
if src.Len() == 0 {
|
||||
if err := s.checkAbsent(src.Type(), t, path); err != nil {
|
||||
return reflect.Value{}, err
|
||||
}
|
||||
}
|
||||
if src.Len() != t.Len() {
|
||||
return reflect.Value{}, at(path, ErrType)
|
||||
}
|
||||
@@ -280,6 +292,11 @@ func (s *state) walk(src, base reflect.Value, t reflect.Type, path string, depth
|
||||
}
|
||||
return out, nil
|
||||
case reflect.Map:
|
||||
if src.Len() == 0 {
|
||||
if err := s.checkAbsent(src.Type(), t, path); err != nil {
|
||||
return reflect.Value{}, err
|
||||
}
|
||||
}
|
||||
if !s.options.deep && src.Type() == t {
|
||||
return src, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user