use core::future::Future;
use core::ops::Deref;
use core::pin::pin;
use core::task;
use crate::chain::chaininterface::BroadcasterInterface;
use crate::sign::SignerProvider;
use crate::util::async_poll::dummy_waker;
use crate::util::logger::Logger;
use crate::util::wallet_utils::{CoinSelectionSourceSync, CoinSelectionSourceSyncWrapper};
use super::{BumpTransactionEvent, BumpTransactionEventHandler};
pub struct BumpTransactionEventHandlerSync<
B: BroadcasterInterface,
C: Deref,
SP: SignerProvider,
L: Logger,
> where
C::Target: CoinSelectionSourceSync,
{
bump_transaction_event_handler:
BumpTransactionEventHandler<B, CoinSelectionSourceSyncWrapper<C>, SP, L>,
}
impl<B: BroadcasterInterface, C: Deref, SP: SignerProvider, L: Logger>
BumpTransactionEventHandlerSync<B, C, SP, L>
where
C::Target: CoinSelectionSourceSync,
{
pub fn new(broadcaster: B, utxo_source: C, signer_provider: SP, logger: L) -> Self {
let bump_transaction_event_handler = BumpTransactionEventHandler::new(
broadcaster,
CoinSelectionSourceSyncWrapper(utxo_source),
signer_provider,
logger,
);
Self { bump_transaction_event_handler }
}
pub fn handle_event(&self, event: &BumpTransactionEvent) {
let mut fut = pin!(self.bump_transaction_event_handler.handle_event(event));
let mut waker = dummy_waker();
let mut ctx = task::Context::from_waker(&mut waker);
match fut.as_mut().poll(&mut ctx) {
task::Poll::Ready(result) => result,
task::Poll::Pending => {
unreachable!("BumpTransactionEventHandlerSync::handle_event should not be pending in a sync context");
},
}
}
}