use microsandbox_protocol::{control::ControlError, wire::WireError};
use microsandbox_protocol_client::{ClientError, Delivery, Message};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ControlClientError {
#[error(transparent)]
Client(#[from] ClientError),
#[error(transparent)]
Wire(#[from] WireError),
#[error("control operation rejected by peer")]
Peer {
error: ControlError,
response: Box<Message>,
},
#[error("invalid control operation response")]
InvalidResponse {
response: Box<Message>,
},
#[error("operation requires framed control (delivery: NotSent)")]
UnsupportedMode,
#[error("runtime session changed before request admission (delivery: NotSent)")]
RuntimeChanged,
#[error("legacy control operation rejected by peer; batch progress unknown")]
LegacyRemote {
reply: Box<crate::JsonReply>,
},
#[error("invalid legacy control operation response")]
InvalidJsonResponse {
reply: Box<crate::JsonReply>,
},
}
pub type ControlClientResult<T> = Result<T, ControlClientError>;
impl ControlClientError {
pub fn delivery(&self) -> Delivery {
match self {
Self::Client(error) => error.delivery,
Self::Wire(_) | Self::UnsupportedMode | Self::RuntimeChanged => Delivery::NotSent,
Self::Peer { .. }
| Self::InvalidResponse { .. }
| Self::LegacyRemote { .. }
| Self::InvalidJsonResponse { .. } => Delivery::Unknown,
}
}
}