use crate::{
error::BandwidthControllerError, ticketbooks::AvailableTicketbooks, traits::CredentialFetcher,
CredentialPublicDataFetcher, EcashTicketRequest, PreparedCredential,
PreparedCredentialMetadata,
};
use nym_credentials_interface::TicketType;
use std::sync::Arc;
pub use sender::BandwidthControllerRequestSender;
use tokio::sync::oneshot;
mod sender;
#[derive(strum::Display)]
pub enum BandwidthControllerRequest {
EcashTicket(ReturnSender<Option<PreparedCredential>>, EcashTicketRequest),
UpgradeModeToken(ReturnSender<Option<String>>),
AttemptRevertSpending(ReturnSender<bool>, PreparedCredentialMetadata),
SetCredentialFetcher(ReturnSender<()>, Option<Arc<dyn CredentialFetcher>>),
SetPublicDataFetcher(
ReturnSender<()>,
Option<Arc<dyn CredentialPublicDataFetcher>>,
),
Reset(ReturnSender<()>),
ClearEmergencyCredentials(ReturnSender<()>),
GetAvailableTicketbooks(ReturnSender<AvailableTicketbooks>),
RestockTicketbooks(ReturnSender<()>, Vec<TicketType>),
WaitForTicketbooks(ReturnSender<()>, Vec<TicketType>),
}
#[derive(Debug)]
pub struct ReturnSender<T> {
sender: oneshot::Sender<Result<T, BandwidthControllerError>>,
}
impl<T> ReturnSender<T>
where
T: std::fmt::Debug,
{
pub fn new() -> (Self, oneshot::Receiver<Result<T, BandwidthControllerError>>) {
let (sender, receiver) = oneshot::channel();
(Self { sender }, receiver)
}
pub fn send(self, response: Result<T, BandwidthControllerError>)
where
T: Send,
{
self.sender
.send(response)
.inspect_err(|_| {
tracing::warn!("Failed to send response, receiver is gone already");
})
.ok();
}
}