use crate::cluster::Cluster;
use crate::errors::{Error, Result};
use crate::task::{Status, Task};
use crate::AdminPolicy;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct UdfRemoveTask {
cluster: Arc<Cluster>,
package_name: String,
}
impl UdfRemoveTask {
pub const fn new(cluster: Arc<Cluster>, package_name: String) -> Self {
UdfRemoveTask {
cluster,
package_name,
}
}
fn build_command() -> String {
String::from("udf-list")
}
fn parse_response(response: &str, package_name: &str) -> Status {
let find = format!("filename={package_name}");
if response.contains(&find) {
Status::InProgress
} else {
Status::Complete
}
}
}
#[async_trait::async_trait]
impl Task for UdfRemoveTask {
async fn query_status(&self) -> Result<Status> {
let nodes = self.cluster.nodes();
if nodes.is_empty() {
return Err(Error::Connection("No connected node".to_string()));
}
let admin_policy = AdminPolicy { timeout: 3_000 };
for node in &nodes {
let command = &UdfRemoveTask::build_command();
let response = node.info(&admin_policy, &[&command[..]]).await?;
if !response.contains_key(command) {
return Ok(Status::NotFound);
}
match UdfRemoveTask::parse_response(&response[command], &self.package_name) {
Status::Complete => {}
status => return Ok(status),
}
}
Ok(Status::Complete)
}
}