Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions pkg/module_manager/go_hook/filter_result.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,81 @@ func (f *Wrapped) UnmarshalTo(v any) error {
return fmt.Errorf("reflect.TypeOf(v): %s", reflect.TypeOf(v))
}

rw := reflect.ValueOf(f.Wrapped)
if rw.Type().AssignableTo(rv.Elem().Type()) {
rv.Elem().Set(rw)
return nil
}

if rw.Kind() == reflect.Pointer {
if rw.IsNil() {
rv.Elem().Set(reflect.Zero(rv.Elem().Type()))
return nil
}
rw = rw.Elem()
}

if !rw.Type().AssignableTo(rv.Elem().Type()) {
return ErrUnmarshalToTypesNotMatch
}

rv.Elem().Set(rw)
return nil
}

func (f *Wrapped) UnmarshalToWithoutAssignable(v any) error {
if f.Wrapped == nil {
return ErrEmptyWrapped
}

rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Pointer || rv.IsNil() {
// error replace with "not pointer"
return fmt.Errorf("reflect.TypeOf(v): %s", reflect.TypeOf(v))
}

rw := reflect.ValueOf(f.Wrapped)
targetType := rv.Elem().Type()
wrappedType := rw.Type()

// Handle nil pointer case
if rw.Kind() == reflect.Pointer && rw.IsNil() {
rv.Elem().Set(reflect.Zero(targetType))
return nil
}

// Check for exact type match
if wrappedType == targetType {
rv.Elem().Set(rw)
return nil
}

// Handle pointer to value conversion
if rw.Kind() == reflect.Pointer {
rw = rw.Elem()
wrappedType = rw.Type()
}

// Check for exact type match after dereferencing
if wrappedType == targetType {
rv.Elem().Set(rw)
return nil
}

return ErrUnmarshalToTypesNotMatch
}

func (f *Wrapped) UnmarshalToOld(v any) error {
if f.Wrapped == nil {
return ErrEmptyWrapped
}

rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Pointer || rv.IsNil() {
// error replace with "not pointer"
return fmt.Errorf("reflect.TypeOf(v): %s", reflect.TypeOf(v))
}

rw := reflect.ValueOf(f.Wrapped)
if rw.Kind() != reflect.Pointer || rw.IsNil() {
rv.Elem().Set(rw)
Expand Down
Loading
Loading