use crate::contracts::{BlockingState, TaskStatus};
use serde::Serialize;
pub const RUNNABILITY_REPORT_VERSION: u32 = 1;
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct QueueRunnabilityReport {
pub version: u32,
pub now: String,
pub selection: QueueRunnabilitySelection,
pub summary: QueueRunnabilitySummary,
pub tasks: Vec<TaskRunnabilityRow>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct QueueRunnabilitySelection {
pub include_draft: bool,
pub prefer_doing: bool,
pub selected_task_id: Option<String>,
pub selected_task_status: Option<TaskStatus>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct QueueRunnabilitySummary {
pub total_active: usize,
pub candidates_total: usize,
pub runnable_candidates: usize,
pub blocked_by_dependencies: usize,
pub blocked_by_schedule: usize,
pub blocked_by_status_or_flags: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocking: Option<BlockingState>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct TaskRunnabilityRow {
pub id: String,
pub status: TaskStatus,
pub runnable: bool,
pub reasons: Vec<NotRunnableReason>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum NotRunnableReason {
StatusNotRunnable { status: TaskStatus },
DraftExcluded,
UnmetDependencies { dependencies: Vec<DependencyIssue> },
ScheduledStartInFuture {
scheduled_start: String,
now: String,
seconds_until_runnable: i64,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum DependencyIssue {
Missing { id: String },
NotComplete { id: String, status: TaskStatus },
}