use objc2::AnyThread;
use objc2::rc::Retained;
use objc2_virtualization::{
VZDiskImageCachingMode, VZDiskImageStorageDeviceAttachment,
VZDiskImageSynchronizationMode, VZVirtioBlockDeviceConfiguration,
};
use crate::util::{ns_error_chain, path_to_nsurl};
use crate::KasouError;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct DiskConfig {
pub path: std::path::PathBuf,
pub read_only: bool,
}
pub(crate) fn create_storage_device(
config: &DiskConfig,
) -> Result<Retained<VZVirtioBlockDeviceConfiguration>, KasouError> {
if !config.path.exists() {
return Err(KasouError::DiskNotFound(config.path.clone()));
}
let url = path_to_nsurl(&config.path)?;
let attachment = unsafe {
VZDiskImageStorageDeviceAttachment::initWithURL_readOnly_cachingMode_synchronizationMode_error(
VZDiskImageStorageDeviceAttachment::alloc(),
&url,
config.read_only,
VZDiskImageCachingMode::Cached,
VZDiskImageSynchronizationMode::Full,
)
}
.map_err(|e| {
KasouError::Framework(format!(
"failed to create disk attachment for {}: {}",
config.path.display(),
ns_error_chain(&e)
))
})?;
let device = unsafe {
VZVirtioBlockDeviceConfiguration::initWithAttachment(
VZVirtioBlockDeviceConfiguration::alloc(),
&attachment,
)
};
Ok(device)
}