use commit_verify::lnpbp4;
use internet2::presentation;
use microservices::rpc::ServerError;
use microservices::{esb, rpc, LauncherError};
use rgb_rpc::{FailureCode, RpcMsg};
use storm::ContainerId;
use crate::bucketd::{FinalizeError, StashError};
use crate::bus::{ServiceBus, ServiceId};
use crate::rgbd::Daemon;
#[derive(Clone, Debug, Display, Error, From)]
#[display(doc_comments)]
pub enum LaunchError {
BusSetupFailure,
#[from]
StoreConnection(ServerError<store_rpc::FailureCode>),
ElectrumConnectivity(String),
}
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]
StormEncoding(presentation::Error),
#[from]
BucketLauncher(LauncherError<Daemon>),
#[from]
Store(ServerError<store_rpc::FailureCode>),
#[display(inner)]
#[from]
#[from(lnpbp4::LeafNotKnown)]
#[from(rgb::bundle::RevealError)]
Stash(StashError),
#[display(inner)]
#[from]
#[from(rgb::psbt::KeyError)]
#[from(bp::dbc::anchor::Error)]
Finalize(FinalizeError),
NoContainer(ContainerId),
RequestNotSupported(ServiceBus, String),
}
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(_, _) => {
FailureCode::UnexpectedRequest
}
DaemonError::Store(_) => FailureCode::Store,
DaemonError::BucketLauncher(_) => FailureCode::Launcher,
DaemonError::Stash(_) => FailureCode::Stash,
DaemonError::Finalize(_) => FailureCode::Finalize,
DaemonError::NoContainer(_) => FailureCode::Store,
};
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())
}
}