use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::error::Result;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CloudTaskHandle {
pub id: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CloudTaskStatus {
Queued,
Running,
Succeeded,
Failed {
message: Option<String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CloudResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub pr_url: Option<String>,
pub branch: String,
pub diff_summary: String,
}
#[async_trait]
pub trait CloudDispatchPort: Send + Sync {
async fn submit_task(&self, repo: &str, branch: &str, prompt: &str) -> Result<CloudTaskHandle>;
async fn poll_status(&self, handle: &CloudTaskHandle) -> Result<CloudTaskStatus>;
async fn harvest(&self, handle: &CloudTaskHandle) -> Result<CloudResult>;
}