use crate::server::controlchan::{
Reply, ReplyCode,
error::ControlChanError,
handler::{CommandContext, CommandHandler},
};
use async_trait::async_trait;
use unftp_core::auth::UserDetail;
use unftp_core::storage::{Metadata, StorageBackend};
#[derive(Debug)]
pub struct Abor;
#[async_trait]
impl<Storage, User> CommandHandler<Storage, User> for Abor
where
Storage: StorageBackend<User> + 'static,
Storage::Metadata: Metadata,
User: UserDetail + 'static,
{
#[tracing_attributes::instrument]
async fn handle(&self, args: CommandContext<Storage, User>) -> Result<Reply, ControlChanError> {
let mut session = args.session.lock().await;
let logger = args.logger;
match session.data_abort_tx.take() {
Some(tx) => {
tokio::spawn(async move {
if let Err(err) = tx.send(()).await {
slog::warn!(logger, "abort failed: {}", err);
}
});
Ok(Reply::new(ReplyCode::ClosingDataConnection, "Closed data channel"))
}
None => Ok(Reply::new(ReplyCode::ClosingDataConnection, "Data channel already closed")),
}
}
}