use arcbox_error::CommonError;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, CoreError>;
#[derive(Debug, Error)]
pub enum CoreError {
#[error(transparent)]
Common(#[from] CommonError),
#[error("VMM error: {0}")]
Vmm(#[from] arcbox_vmm::VmmError),
#[error("snapshot error: {0}")]
Snapshot(#[from] arcbox_vmm::SnapshotError),
#[error("VM error: {0}")]
Vm(String),
#[error("machine error: {0}")]
Machine(String),
#[error("{message}")]
Agent {
code: i32,
message: String,
},
#[error("{context}: {source}")]
Transport {
context: &'static str,
#[source]
source: arcbox_transport::error::TransportError,
},
#[error("persistence error: {0}")]
Persistence(#[from] toml::de::Error),
#[error("internal lock poisoned")]
LockPoisoned,
#[error("filesystem error: {0}")]
Fs(#[from] arcbox_fs::FsError),
#[error("network error: {0}")]
Net(#[from] arcbox_net::NetError),
#[error("image error: {0}")]
Image(String),
#[cfg(target_os = "macos")]
#[error("macOS image error: {0}")]
Macos(String),
#[cfg(target_os = "macos")]
#[error("macOS virtualization error: {0}")]
Vz(#[from] arcbox_vz::VZError),
}
impl CoreError {
#[must_use]
pub fn config(msg: impl Into<String>) -> Self {
Self::Common(CommonError::config(msg))
}
#[must_use]
pub fn not_found(resource: impl Into<String>) -> Self {
Self::Common(CommonError::not_found(resource))
}
#[must_use]
pub fn already_exists(resource: impl Into<String>) -> Self {
Self::Common(CommonError::already_exists(resource))
}
#[must_use]
pub fn invalid_state(msg: impl Into<String>) -> Self {
Self::Common(CommonError::invalid_state(msg))
}
#[must_use]
pub fn image(msg: impl Into<String>) -> Self {
Self::Image(msg.into())
}
#[cfg(target_os = "macos")]
#[must_use]
pub fn macos(msg: impl Into<String>) -> Self {
Self::Macos(msg.into())
}
}
impl From<std::io::Error> for CoreError {
fn from(err: std::io::Error) -> Self {
Self::Common(CommonError::from(err))
}
}
impl From<arcbox_transport::error::TransportError> for CoreError {
fn from(source: arcbox_transport::error::TransportError) -> Self {
Self::Transport {
context: "guest-agent transport failed",
source,
}
}
}
impl From<arcbox_engine::EngineError> for CoreError {
fn from(err: arcbox_engine::EngineError) -> Self {
use arcbox_engine::EngineError as E;
match err {
E::Common(c) => Self::Common(c),
E::Vmm(e) => Self::Vmm(e),
E::Snapshot(e) => Self::Snapshot(e),
E::Vm(msg) => Self::Vm(msg),
E::Machine(msg) => Self::Machine(msg),
E::Agent { code, message } => Self::Agent { code, message },
E::Transport { context, source } => Self::Transport { context, source },
E::Net(e) => Self::Net(e),
E::Image(img) => Self::from(img),
E::Persistence(e) => Self::Persistence(e),
E::LockPoisoned => Self::LockPoisoned,
}
}
}
impl From<arcbox_image::ImageError> for CoreError {
fn from(err: arcbox_image::ImageError) -> Self {
match err {
arcbox_image::ImageError::Common(c) => Self::Common(c),
arcbox_image::ImageError::Image(msg) => Self::Image(msg),
}
}
}