use thiserror::Error;
use tonic::Status;
#[derive(Error, Debug)]
pub enum NodeError {
#[error("General error: {0}")]
General(#[from] anyhow::Error),
#[error("Broadcast error: {0}")]
Broadcast(#[from] BroadcastError),
}
#[derive(Error, Debug)]
#[error("Broadcast error {code:?} with log: {message}")]
pub struct BroadcastError {
pub code: Option<u32>,
pub message: String,
}
impl From<Status> for BroadcastError {
fn from(error: Status) -> Self {
BroadcastError {
code: None,
message: error.message().to_string(),
}
}
}
impl BroadcastError {
pub(crate) fn get_collateral_reason(&self) -> Option<&str> {
match self {
BroadcastError {
code: Some(3007), ..
} => {
Some("Broadcast error 3007 received (under collaterization), ignoring")
}
BroadcastError {
code: None,
message,
} if message.contains("StillUndercollateralized")
|| message.contains("NewlyUndercollateralized") =>
{
Some("Broadcast error 'StillUndercollateralized' / 'NewlyUndercollateralized', ignoring")
}
_ => None,
}
}
}