use futures::future::BoxFuture;
pub use hopr_types::{
internal::prelude::{RedeemableTicket, VerifiedTicket},
primitive::prelude::HoprBalance,
};
use crate::chain::{ChainReceipt, WinningProbability};
#[auto_impl::auto_impl(&, Box, Arc)]
pub trait ChainReadTicketOperations {
type Error: std::error::Error + Send + Sync + 'static;
fn incoming_ticket_values(&self) -> Result<(WinningProbability, HoprBalance), Self::Error>;
fn outgoing_ticket_values(
&self,
configured_wp: Option<WinningProbability>,
configured_price: Option<HoprBalance>,
) -> Result<(WinningProbability, HoprBalance), Self::Error> {
match (configured_wp, configured_price) {
(Some(wp), Some(price)) => Ok((wp, price)),
(None, Some(price)) => Ok((self.incoming_ticket_values()?.0, price)),
(Some(wp), None) => Ok((wp, self.incoming_ticket_values()?.1)),
_ => self.incoming_ticket_values(),
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum TicketRedeemError<E> {
#[error("redemption of ticket {0} was rejected due to: {1}")]
Rejected(VerifiedTicket, String),
#[error("processing error during redemption of ticket {0}: {1}")]
ProcessingError(VerifiedTicket, E),
}
#[async_trait::async_trait]
#[auto_impl::auto_impl(&, Box, Arc)]
pub trait ChainWriteTicketOperations {
type Error: std::error::Error + Send + Sync + 'static;
async fn redeem_ticket<'a>(
&'a self,
ticket: RedeemableTicket,
) -> Result<
BoxFuture<'a, Result<(VerifiedTicket, ChainReceipt), TicketRedeemError<Self::Error>>>,
TicketRedeemError<Self::Error>,
>;
}