use std::io;
use amplify::IoError;
use bitcoin::util::bip32;
use internet2::{presentation, transport};
use lnp::router;
use microservices::{esb, LauncherError};
use wallet::psbt::sign::SignError;
use crate::bus::ServiceBus;
use crate::channeld;
use crate::lnpd::automata::launch;
use crate::lnpd::{funding, Daemon};
use crate::routed::PaymentError;
use crate::rpc::{self, ServiceId};
#[derive(Debug, Display, From, Error)]
#[display(doc_comments)]
#[non_exhaustive]
pub enum Error {
#[from(io::Error)]
Io(IoError),
#[from]
Esb(esb::Error<ServiceId>),
#[from]
Rpc(rpc::Error),
#[from(LauncherError<Daemon>)]
DaemonLaunch(Box<LauncherError<Daemon>>),
#[from]
Peer(presentation::Error),
#[from]
#[from(lnp::channel::bolt::Error)]
Channel(channeld::Error),
#[from]
GossipRouter(router::gossip::Error),
#[from]
ChannelLaunch(launch::Error),
#[from]
Payment(PaymentError),
Persistence(strict_encoding::Error),
#[from]
BitcoinEncoding(bitcoin::consensus::encode::Error),
#[from]
StrictEncoding(strict_encoding::Error),
#[from]
#[display(inner)]
FundingWallet(funding::Error),
#[from]
Derivation(bip32::Error),
#[from]
Miniscript(miniscript::Error),
#[from]
Signing(SignError),
#[from(zmq::Error)]
#[from]
Bridge(transport::Error),
#[from(electrum_client::Error)]
ElectrumConnectivity,
NotSupported(ServiceBus, String),
SourceNotSupported(ServiceBus, String, ServiceId),
Misbehaving,
Terminate(String),
#[display(inner)]
#[from(internet2::addr::NoOnionSupportError)]
Other(String),
}
impl microservices::error::Error for Error {}
impl From<Error> for esb::Error<ServiceId> {
fn from(err: Error) -> Self {
match err {
Error::Esb(err) => err,
err => esb::Error::ServiceError(err.to_string()),
}
}
}
impl Error {
pub fn wrong_esb_msg(bus: ServiceBus, message: &impl ToString) -> Error {
Error::NotSupported(bus, message.to_string())
}
pub fn wrong_esb_msg_source(
bus: ServiceBus,
message: &impl ToString,
source: ServiceId,
) -> Error {
Error::SourceNotSupported(bus, message.to_string(), source)
}
}