use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use bytes::BytesMut;
use crate::error::{Error, Result};
use crate::protocol::frontend;
#[derive(Clone, Debug)]
pub struct CancelToken {
host: String,
port: u16,
process_id: i32,
secret_key: i32,
}
impl CancelToken {
pub fn new(host: impl Into<String>, port: u16, process_id: i32, secret_key: i32) -> Self {
Self {
host: host.into(),
port,
process_id,
secret_key,
}
}
pub async fn cancel(&self) -> Result<()> {
let addr = format!("{}:{}", self.host, self.port);
let mut stream = TcpStream::connect(&addr).await.map_err(Error::Io)?;
let mut buf = BytesMut::with_capacity(16);
frontend::cancel_request(&mut buf, self.process_id, self.secret_key);
stream.write_all(&buf).await.map_err(Error::Io)?;
stream.shutdown().await.map_err(Error::Io)?;
Ok(())
}
}