Implement transport traits with generics

pull/2/head
rishflab 4 years ago
parent bf576bf251
commit 666c121bb3

@ -3,7 +3,7 @@ use crate::{
bitcoin::{BroadcastSignedTransaction, WatchForRawTransaction},
bob, monero,
monero::{CreateWalletForOutput, Transfer},
transport::{Receive, Send},
transport::{ReceiveMessage, SendMessage},
};
use anyhow::{anyhow, Result};
use ecdsa_fun::{
@ -21,7 +21,7 @@ pub async fn next_state<
R: RngCore + CryptoRng,
B: WatchForRawTransaction + BroadcastSignedTransaction,
M: CreateWalletForOutput + Transfer,
T: Send<Message> + Receive<bob::Message>,
T: SendMessage<Message> + ReceiveMessage<bob::Message>,
>(
bitcoin_wallet: &B,
monero_wallet: &M,

@ -6,7 +6,7 @@ use crate::{
},
monero,
monero::{CheckTransfer, CreateWalletForOutput},
transport::{Receive, Send},
transport::{ReceiveMessage, SendMessage},
};
use anyhow::{anyhow, Result};
use ecdsa_fun::{
@ -25,7 +25,7 @@ pub async fn next_state<
R: RngCore + CryptoRng,
B: WatchForRawTransaction + SignTxLock + BuildTxLockPsbt + BroadcastSignedTransaction,
M: CreateWalletForOutput + CheckTransfer,
T: Send<Message> + Receive<alice::Message>,
T: SendMessage<Message> + ReceiveMessage<alice::Message>,
>(
bitcoin_wallet: &B,
monero_wallet: &M,

@ -2,11 +2,11 @@ use anyhow::Result;
use async_trait::async_trait;
#[async_trait]
pub trait Send<SendMsg> {
pub trait SendMessage<SendMsg> {
async fn send_message(&mut self, message: SendMsg) -> Result<()>;
}
#[async_trait]
pub trait Receive<RecvMsg> {
pub trait ReceiveMessage<RecvMsg> {
async fn receive_message(&mut self) -> Result<RecvMsg>;
}

@ -4,10 +4,7 @@ use tokio::{
stream::StreamExt,
sync::mpsc::{Receiver, Sender},
};
use xmr_btc::{
alice, bob,
transport::{Receive, Send},
};
use xmr_btc::transport::{ReceiveMessage, SendMessage};
#[derive(Debug)]
pub struct Transport<SendMsg, RecvMsg> {
@ -16,32 +13,12 @@ pub struct Transport<SendMsg, RecvMsg> {
}
#[async_trait]
impl Send<alice::Message> for Transport<alice::Message, bob::Message> {
async fn send_message(&mut self, message: alice::Message) -> Result<()> {
let _ = self
.sender
.send(message)
.await
.map_err(|_| anyhow!("failed to send message"))?;
Ok(())
}
}
#[async_trait]
impl Receive<bob::Message> for Transport<alice::Message, bob::Message> {
async fn receive_message(&mut self) -> Result<bob::Message> {
let message = self
.receiver
.next()
.await
.ok_or_else(|| anyhow!("failed to receive message"))?;
Ok(message)
}
}
#[async_trait]
impl Send<bob::Message> for Transport<bob::Message, alice::Message> {
async fn send_message(&mut self, message: bob::Message) -> Result<()> {
impl<SendMsg, RecvMsg> SendMessage<SendMsg> for Transport<SendMsg, RecvMsg>
where
SendMsg: Send + Sync,
RecvMsg: std::marker::Send,
{
async fn send_message(&mut self, message: SendMsg) -> Result<()> {
let _ = self
.sender
.send(message)
@ -52,8 +29,12 @@ impl Send<bob::Message> for Transport<bob::Message, alice::Message> {
}
#[async_trait]
impl Receive<alice::Message> for Transport<bob::Message, alice::Message> {
async fn receive_message(&mut self) -> Result<alice::Message> {
impl<SendMsg, RecvMsg> ReceiveMessage<RecvMsg> for Transport<SendMsg, RecvMsg>
where
SendMsg: std::marker::Send,
RecvMsg: Send + Sync,
{
async fn receive_message(&mut self) -> Result<RecvMsg> {
let message = self
.receiver
.next()

Loading…
Cancel
Save