func NewReflectedFinalizersAccessor()

in rocketmq-knative/source/pkg/controller/sdk/finalizers_accessor.go [37:63]


func NewReflectedFinalizersAccessor(object interface{}) (FinalizersAccessor, error) {
	objectValue := reflect.Indirect(reflect.ValueOf(object))

	// If object is not a struct, don't even try to use it.
	if objectValue.Kind() != reflect.Struct {
		return nil, errors.New("object is not a struct")
	}

	finalizersField := objectValue.FieldByName("Finalizers")
	if finalizersField.IsValid() && finalizersField.CanSet() && finalizersField.Kind() == reflect.Slice {
		finalizers := sets.NewString()
		for i := 0; i < finalizersField.Len(); i++ {
			finalizer := finalizersField.Index(i)
			if finalizer.IsValid() && finalizer.Kind() == reflect.String {
				finalizers.Insert(finalizer.String())
			} else {
				return nil, fmt.Errorf("element in the Finalizer slice was not a string: %v", finalizer.Kind())
			}
		}
		return &reflectedFinalizersAccessor{
			finalizersField: finalizersField,
			finalizersSet:   finalizers,
		}, nil
	}

	return nil, fmt.Errorf("finalizer was not a slice: %v", finalizersField.Kind())
}