ralph/queue/operations/runnability/
model.rs1use crate::contracts::{BlockingState, TaskStatus};
17use serde::Serialize;
18
19pub const RUNNABILITY_REPORT_VERSION: u32 = 1;
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
24#[serde(rename_all = "snake_case")]
25pub struct QueueRunnabilityReport {
26 pub version: u32,
27 pub now: String,
28 pub selection: QueueRunnabilitySelection,
29 pub summary: QueueRunnabilitySummary,
30 pub tasks: Vec<TaskRunnabilityRow>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
35#[serde(rename_all = "snake_case")]
36pub struct QueueRunnabilitySelection {
37 pub include_draft: bool,
38 pub prefer_doing: bool,
39 pub selected_task_id: Option<String>,
40 pub selected_task_status: Option<TaskStatus>,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
45#[serde(rename_all = "snake_case")]
46pub struct QueueRunnabilitySummary {
47 pub total_active: usize,
48 pub candidates_total: usize,
49 pub runnable_candidates: usize,
50 pub blocked_by_dependencies: usize,
51 pub blocked_by_schedule: usize,
52 pub blocked_by_status_or_flags: usize,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub blocking: Option<BlockingState>,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
59#[serde(rename_all = "snake_case")]
60pub struct TaskRunnabilityRow {
61 pub id: String,
62 pub status: TaskStatus,
63 pub runnable: bool,
64 pub reasons: Vec<NotRunnableReason>,
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
69#[serde(tag = "kind", rename_all = "snake_case")]
70pub enum NotRunnableReason {
71 StatusNotRunnable { status: TaskStatus },
73 DraftExcluded,
75 UnmetDependencies { dependencies: Vec<DependencyIssue> },
77 ScheduledStartInFuture {
79 scheduled_start: String,
80 now: String,
81 seconds_until_runnable: i64,
82 },
83}
84
85#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
87#[serde(tag = "kind", rename_all = "snake_case")]
88pub enum DependencyIssue {
89 Missing { id: String },
91 NotComplete { id: String, status: TaskStatus },
93}