use crate::actors::{Handler, Message, OrchestrationActor};
use crate::orchestration::lifecycle::task_finalization::{FinalizationResult, TaskFinalizer};
use async_trait::async_trait;
use std::sync::Arc;
use tasker_shared::system_context::SystemContext;
use tasker_shared::TaskerResult;
use tracing::{debug, info};
use uuid::Uuid;
#[derive(Debug, Clone)]
pub struct FinalizeTaskMessage {
pub task_uuid: Uuid,
}
impl Message for FinalizeTaskMessage {
type Response = FinalizationResult;
}
#[derive(Debug)]
pub struct TaskFinalizerActor {
context: Arc<SystemContext>,
service: TaskFinalizer,
}
impl TaskFinalizerActor {
pub fn new(context: Arc<SystemContext>, service: TaskFinalizer) -> Self {
Self { context, service }
}
}
impl OrchestrationActor for TaskFinalizerActor {
fn name(&self) -> &'static str {
"TaskFinalizerActor"
}
fn context(&self) -> &Arc<SystemContext> {
&self.context
}
fn started(&mut self) -> TaskerResult<()> {
info!(
actor = %self.name(),
"TaskFinalizerActor started - ready to finalize tasks with atomic claiming"
);
Ok(())
}
fn stopped(&mut self) -> TaskerResult<()> {
info!(
actor = %self.name(),
"TaskFinalizerActor stopped"
);
Ok(())
}
}
#[async_trait]
impl Handler<FinalizeTaskMessage> for TaskFinalizerActor {
type Response = FinalizationResult;
async fn handle(&self, msg: FinalizeTaskMessage) -> TaskerResult<Self::Response> {
debug!(
actor = %self.name(),
task_uuid = %msg.task_uuid,
"Finalizing task with atomic claiming"
);
let result = self
.service
.finalize_task(msg.task_uuid)
.await
.map_err(|e| tasker_shared::TaskerError::OrchestrationError(e.to_string()))?;
debug!(
actor = %self.name(),
task_uuid = %msg.task_uuid,
action = ?result.action,
"Task finalization completed successfully"
);
Ok(result)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_task_finalizer_actor_implements_traits() {
fn assert_orchestration_actor<T: OrchestrationActor>() {}
fn assert_handler<T: Handler<FinalizeTaskMessage>>() {}
assert_orchestration_actor::<TaskFinalizerActor>();
assert_handler::<TaskFinalizerActor>();
}
#[test]
fn test_finalize_task_message_implements_message() {
fn assert_message<T: Message>() {}
assert_message::<FinalizeTaskMessage>();
}
}