use crate::contracts::SupervisedTask;
use crate::enums::{ControlMessage, SupervisionStatus};
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use tokio::sync::{broadcast, watch};
pub type PrerequisiteFuture = Pin<Box<dyn Future<Output = anyhow::Result<()>> + Send + 'static>>;
pub type DepSetupReceivers = Vec<(&'static str, watch::Receiver<Option<Result<(), String>>>)>;
#[derive(Debug, Clone)]
pub struct SupervisionResult {
pub task_name: String,
pub task_id: String,
pub total_attempts: usize,
pub final_status: SupervisionStatus,
}
pub struct TaskEntry {
pub task: Arc<dyn SupervisedTask>,
pub setup_tx: watch::Sender<Option<Result<(), String>>>,
pub control_tx: broadcast::Sender<ControlMessage>,
}