#[cfg(feature = "server")]
use async_trait::async_trait;
use crate::{
Message,
domain::{
A2AError, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams,
ListTaskPushNotificationConfigsParams, ListTasksParams, ListTasksResult, Task,
TaskIdParams, TaskPushNotificationConfig, TaskQueryParams, TaskState,
},
};
pub trait TaskManager {
fn create_task(&self, task_id: &str, context_id: &str) -> Result<Task, A2AError>;
fn get_task(&self, task_id: &str, history_length: Option<u32>) -> Result<Task, A2AError>;
fn update_task_status(
&self,
task_id: &str,
state: TaskState,
message: Option<Message>,
) -> Result<Task, A2AError>;
fn cancel_task(&self, task_id: &str) -> Result<Task, A2AError>;
fn task_exists(&self, task_id: &str) -> Result<bool, A2AError>;
fn list_tasks(
&self,
_context_id: Option<&str>,
_limit: Option<u32>,
) -> Result<Vec<Task>, A2AError> {
Err(A2AError::UnsupportedOperation(
"Task listing not implemented".to_string(),
))
}
fn get_task_metadata(
&self,
task_id: &str,
) -> Result<serde_json::Map<String, serde_json::Value>, A2AError> {
let task = self.get_task(task_id, None)?;
if let Some(metadata) = task.metadata.as_option() {
let val = serde_json::to_value(metadata)?;
if let serde_json::Value::Object(map) = val {
return Ok(map);
}
}
Ok(serde_json::Map::new())
}
fn validate_task_params(&self, params: &TaskQueryParams) -> Result<(), A2AError> {
if params.id.trim().is_empty() {
return Err(A2AError::ValidationError {
field: "task_id".to_string(),
message: "Task ID cannot be empty".to_string(),
});
}
if let Some(history_length) = params.history_length {
if history_length > 1000 {
return Err(A2AError::ValidationError {
field: "history_length".to_string(),
message: "History length cannot exceed 1000".to_string(),
});
}
}
Ok(())
}
}
#[cfg(feature = "server")]
#[async_trait]
pub trait AsyncTaskManager: Send + Sync {
async fn create_task(&self, task_id: &str, context_id: &str) -> Result<Task, A2AError>;
async fn get_task(&self, task_id: &str, history_length: Option<u32>) -> Result<Task, A2AError>;
async fn update_task_status(
&self,
task_id: &str,
state: TaskState,
message: Option<Message>,
) -> Result<Task, A2AError>;
async fn cancel_task(&self, task_id: &str) -> Result<Task, A2AError>;
async fn task_exists(&self, task_id: &str) -> Result<bool, A2AError>;
async fn list_tasks(
&self,
_context_id: Option<&str>,
_limit: Option<u32>,
) -> Result<Vec<Task>, A2AError> {
Err(A2AError::UnsupportedOperation(
"Task listing not implemented".to_string(),
))
}
async fn get_task_metadata(
&self,
task_id: &str,
) -> Result<serde_json::Map<String, serde_json::Value>, A2AError> {
let task = self.get_task(task_id, None).await?;
if let Some(metadata) = task.metadata.as_option() {
let val = serde_json::to_value(metadata)?;
if let serde_json::Value::Object(map) = val {
return Ok(map);
}
}
Ok(serde_json::Map::new())
}
async fn validate_task_params(&self, params: &TaskQueryParams) -> Result<(), A2AError> {
if params.id.trim().is_empty() {
return Err(A2AError::ValidationError {
field: "task_id".to_string(),
message: "Task ID cannot be empty".to_string(),
});
}
if let Some(history_length) = params.history_length {
if history_length > 1000 {
return Err(A2AError::ValidationError {
field: "history_length".to_string(),
message: "History length cannot exceed 1000".to_string(),
});
}
}
Ok(())
}
async fn get_task_validated(&self, params: &TaskQueryParams) -> Result<Task, A2AError> {
self.validate_task_params(params).await?;
self.get_task(¶ms.id, params.history_length).await
}
async fn cancel_task_validated(&self, params: &TaskIdParams) -> Result<Task, A2AError> {
if params.id.trim().is_empty() {
return Err(A2AError::ValidationError {
field: "task_id".to_string(),
message: "Task ID cannot be empty".to_string(),
});
}
self.cancel_task(¶ms.id).await
}
async fn list_tasks_v3(&self, _params: &ListTasksParams) -> Result<ListTasksResult, A2AError> {
Err(A2AError::UnsupportedOperation(
"Task listing with pagination not implemented".to_string(),
))
}
async fn get_push_notification_config(
&self,
_params: &GetTaskPushNotificationConfigParams,
) -> Result<TaskPushNotificationConfig, A2AError> {
Err(A2AError::UnsupportedOperation(
"Get push notification config not implemented".to_string(),
))
}
async fn list_push_notification_configs(
&self,
_params: &ListTaskPushNotificationConfigsParams,
) -> Result<Vec<TaskPushNotificationConfig>, A2AError> {
Err(A2AError::UnsupportedOperation(
"List push notification configs not implemented".to_string(),
))
}
async fn delete_push_notification_config(
&self,
_params: &DeleteTaskPushNotificationConfigParams,
) -> Result<(), A2AError> {
Err(A2AError::UnsupportedOperation(
"Delete push notification config not implemented".to_string(),
))
}
}