diff --git a/pallets/connectors/src/lib.rs b/pallets/connectors/src/lib.rs index 5422fa2b48..b93313c6d9 100644 --- a/pallets/connectors/src/lib.rs +++ b/pallets/connectors/src/lib.rs @@ -25,8 +25,7 @@ pub use routers::*; // Type aliases pub type PoolIdOf = <::PoolInspect as PoolInspect<::AccountId>>::PoolId; -pub type MessageOf = - Message>; +pub type MessageOf = Message>; #[frame_support::pallet] pub mod pallet { @@ -129,6 +128,12 @@ pub mod pallet { pub enum Error { /// A pool could not be found PoolNotFound, + + /// The specified domain has no associated router + InvalidDomain, + + /// Failed to send a message + SendFailure, } #[pallet::call] @@ -159,7 +164,10 @@ pub mod pallet { // skeleton pub fn do_send_message(message: MessageOf, domain: Domain) -> Result<(), Error> { - todo!("nuno") + let router = >::get(domain.clone()).ok_or(Error::::InvalidDomain)?; + router + .send(domain, message) + .map_err(|_| Error::::SendFailure) } } } diff --git a/pallets/connectors/src/routers.rs b/pallets/connectors/src/routers.rs index 2aadf66fed..aa8454bcf9 100644 --- a/pallets/connectors/src/routers.rs +++ b/pallets/connectors/src/routers.rs @@ -1,5 +1,14 @@ +use crate::{Domain, Message}; use codec::{Decode, Encode}; use scale_info::TypeInfo; +use sp_runtime::DispatchResult; + +pub trait ConnectorRouter +where + Message: Encode + Decode, +{ + fn send(target: Domain, message: Message) -> DispatchResult; +} #[derive(Encode, Decode, Clone, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] @@ -8,14 +17,45 @@ pub enum Router { XCM(XCMRouter), } +impl Router { + pub fn send( + &self, + domain: Domain, + message: Message, + ) -> DispatchResult { + match self { + Router::XCM(xcm_router) => XCMRouter::send(domain, message), + Router::Nomad(nomad_router) => NomadRouter::send(domain, message), + } + } +} + #[derive(Encode, Decode, Default, Clone, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] pub struct NomadRouter { forwarding_contract: String, // TODO(nuno): make it a MultiLocation } +impl ConnectorRouter for NomadRouter +where + Message: Encode + Decode, +{ + fn send(target: Domain, message: Message) -> DispatchResult { + todo!() + } +} + #[derive(Encode, Decode, Default, Clone, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] pub struct XCMRouter { multilocations: (), // TODO(nuno): make it a Map } + +impl ConnectorRouter for XCMRouter +where + Message: Encode + Decode, +{ + fn send(target: Domain, message: Message) -> DispatchResult { + todo!() + } +}