use crate::{api::UnexpectedTxStatus, rpc::Error as RpcClientError, ExtrinsicReport};
use ac_node_api::{
error::DispatchError,
metadata::{MetadataConversionError, MetadataError},
};
use alloc::{boxed::Box, vec::Vec};
use codec::{Decode, Encode};
use core::error::Error as ErrorT;
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug, derive_more::From)]
pub enum Error {
FetchGenesisHash,
NoSigner,
RpcClient(RpcClientError),
Metadata(MetadataError),
InvalidMetadata(MetadataConversionError),
NodeApi(ac_node_api::error::Error),
Codec(codec::Error),
TryFromIntError,
FailedExtrinsic(FailedExtrinsicError),
UnexpectedTxStatus(UnexpectedTxStatus),
NoStream,
ExtrinsicNotFound,
BlockHashNotFound,
BlockNotFound,
EventsMissing,
EventsAlreadyPresent,
Other(Box<dyn ErrorT + Send + Sync + 'static>),
}
#[derive(Debug)]
pub struct FailedExtrinsicError {
dispatch_error: DispatchError,
encoded_report: Vec<u8>,
}
impl FailedExtrinsicError {
pub fn new(dispatch_error: DispatchError, encoded_report: Vec<u8>) -> Self {
Self { dispatch_error, encoded_report }
}
pub fn dispatch_error(&self) -> &DispatchError {
&self.dispatch_error
}
pub fn get_report<Hash: Encode + Decode>(&self) -> Result<ExtrinsicReport<Hash>> {
let report = Decode::decode(&mut self.encoded_report.as_slice())?;
Ok(report)
}
pub fn encoded_report(&self) -> &[u8] {
&self.encoded_report
}
}