Reason for not using Pointer slices as return values for ListAllXXXX(...) functions
Hi, currently, I try to unittest my code and need to abstract libvirt calls through interfaces. However, I encountered a problem when replacing the ListAll(...) functions with interfaces. Namely that they return struct slices instead of struct pointer ones. For that reason, I cannot directly use the libvirt.Connect struct and have to wrap it in another struct, converting the struct slices to struct pointer slices. Before I change the code, I want to ask if there was a specific reason not to use the code and if it is possible bring my change upstream?
Current hack
func (l *connectionWrapper) ListAllStoragePools(flags libvirt.ConnectListAllStoragePoolsFlags) ([]storagePoolInterface, error) {
noPtrPools, err := l.conn.ListAllStoragePools(flags)
var pools []storagePoolInterface
for i := 0; i < len(noPtrPools); i++ {
pools = append(pools, &noPtrPools[i])
}
return pools, err
}
So my proposed change would be to transform
func (c *Connect) ListAllStoragePools(flags ConnectListAllStoragePoolsFlags) ([]StoragePool, error) {
var cList *C.virStoragePoolPtr
var err C.virError
numPools := C.virConnectListAllStoragePoolsWrapper(c.ptr, (**C.virStoragePoolPtr)(&cList), C.uint(flags), &err)
if numPools == -1 {
return nil, makeError(&err)
}
hdr := reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(cList)),
Len: int(numPools),
Cap: int(numPools),
}
var pools []StoragePool
slice := *(*[]C.virStoragePoolPtr)(unsafe.Pointer(&hdr))
for _, ptr := range slice {
pools = append(pools, StoragePool{ptr})
}
C.free(unsafe.Pointer(cList))
return pools, nil
}
into
func (c *Connect) ListAllStoragePools(flags ConnectListAllStoragePoolsFlags) ([]*StoragePool, error) {
var cList *C.virStoragePoolPtr
var err C.virError
numPools := C.virConnectListAllStoragePoolsWrapper(c.ptr, (**C.virStoragePoolPtr)(&cList), C.uint(flags), &err)
if numPools == -1 {
return nil, makeError(&err)
}
hdr := reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(cList)),
Len: int(numPools),
Cap: int(numPools),
}
var pools []*StoragePool
slice := *(*[]C.virStoragePoolPtr)(unsafe.Pointer(&hdr))
for _, ptr := range slice {
pools = append(pools, &StoragePool{ptr})
}
C.free(unsafe.Pointer(cList))
return pools, nil
}
Since this changes the API I want to discuss it before creating any PRs