use super::Message;
use sp_runtime::DispatchError;
use xcm::latest::{SendError, Xcm};
use Debug;
pub trait ConvertMessage {
fn convert(message: Message) -> Result<Xcm<()>, ConvertMessageError>;
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum ConvertMessageError {
InvalidAsset,
CannotReanchor,
InvalidNetwork,
}
#[derive(Clone, Debug, PartialEq)]
pub enum MessageProcessorError {
ProcessMessage(DispatchError),
ConvertMessage(ConvertMessageError),
SendMessage(SendError),
}
pub trait MessageProcessor<AccountId> {
fn can_process_message(relayer: &AccountId, message: &Message) -> bool;
fn process_message(
relayer: AccountId,
message: Message,
) -> Result<[u8; 32], MessageProcessorError>;
}
#[impl_trait_for_tuples::impl_for_tuples(10)]
impl<AccountId> MessageProcessor<AccountId> for Tuple {
fn can_process_message(relayer: &AccountId, message: &Message) -> bool {
for_tuples!( #(
match Tuple::can_process_message(&relayer, &message) {
true => {
return true;
},
_ => {}
}
)* );
false
}
fn process_message(
relayer: AccountId,
message: Message,
) -> Result<[u8; 32], MessageProcessorError> {
for_tuples!( #(
match Tuple::can_process_message(&relayer, &message) {
true => {
return Tuple::process_message(relayer, message)
},
_ => {}
}
)* );
Err(MessageProcessorError::ProcessMessage(DispatchError::Other(
"No handler found for message!",
)))
}
}