use internet2::presentation;
use microservices::rpc::ServerError;
use microservices::{esb, rpc, LauncherError};
use storm::ContainerId;
use storm_rpc::{FailureCode, RpcMsg, ServiceId};
use crate::bus::ServiceBus;
use crate::stormd::Daemon;
use crate::transferd;
#[derive(Clone, Debug, Display, Error, From)]
#[display(doc_comments)]
pub enum LaunchError {
BusSetupFailure,
#[from]
StoreConnection(ServerError<store_rpc::FailureCode>),
}
impl microservices::error::Error for LaunchError {}
#[derive(Debug, Display, Error, From)]
#[display(doc_comments)]
pub(crate) enum DaemonError {
#[from]
#[display(inner)]
Encoding(strict_encoding::Error),
#[from]
Esb(esb::Error<ServiceId>),
#[from(LauncherError<Daemon>)]
DaemonLaunch(Box<LauncherError<Daemon>>),
#[display(inner)]
#[from]
Store(ServerError<store_rpc::FailureCode>),
#[from]
#[display(inner)]
TransferAutomation(transferd::AutomationError),
#[from]
StormEncoding(presentation::Error),
RequestNotSupported(ServiceBus, String),
SourceNotSupported(ServiceBus, String, ServiceId),
UnknownContainer(ContainerId),
}
impl microservices::error::Error for DaemonError {}
impl From<DaemonError> for esb::Error<ServiceId> {
fn from(err: DaemonError) -> Self { esb::Error::ServiceError(err.to_string()) }
}
impl From<DaemonError> for RpcMsg {
fn from(err: DaemonError) -> Self {
let code = match err {
DaemonError::StormEncoding(_) | DaemonError::Encoding(_) => FailureCode::Encoding,
DaemonError::Esb(_) => FailureCode::Esb,
DaemonError::RequestNotSupported(_, _) | DaemonError::SourceNotSupported(_, _, _) => {
FailureCode::UnexpectedRequest
}
DaemonError::TransferAutomation(_) => FailureCode::TransferAutomation,
DaemonError::DaemonLaunch(_) => FailureCode::Launch,
DaemonError::Store(_) => FailureCode::Store,
DaemonError::UnknownContainer(_) => FailureCode::UnknownContainer,
};
RpcMsg::Failure(rpc::Failure {
code: code.into(),
info: err.to_string(),
})
}
}
impl DaemonError {
pub(crate) fn wrong_esb_msg(bus: ServiceBus, message: &impl ToString) -> DaemonError {
DaemonError::RequestNotSupported(bus, message.to_string())
}
pub(crate) fn wrong_esb_msg_source(
bus: ServiceBus,
message: &impl ToString,
source: ServiceId,
) -> DaemonError {
DaemonError::SourceNotSupported(bus, message.to_string(), source)
}
}