Skip to main content

ralph/cli/task/args/
types.rs

1//! Shared types for task CLI arguments.
2//!
3//! Responsibilities:
4//! - Define ValueEnum types for CLI argument parsing (BatchMode, TaskPriorityArg,
5//!   TaskStatusArg, TaskEditFieldArg, and task decomposition enums).
6//! - Provide conversions from CLI types to internal domain types.
7//!
8//! Not handled here:
9//! - Args structs with clap derive macros (see specific command modules).
10//! - Command execution logic.
11//!
12//! Invariants/assumptions:
13//! - All types must be Clone where needed for clap.
14//! - Conversions to internal types are infallible and direct.
15
16use clap::ValueEnum;
17
18use crate::contracts::{TaskPriority, TaskStatus};
19use crate::queue::TaskEditKey;
20
21/// Batching mode for grouping related files in build-refactor.
22#[derive(ValueEnum, Clone, Copy, Debug, Default)]
23#[clap(rename_all = "snake_case")]
24pub enum BatchMode {
25    /// Group files in same directory with similar names (e.g., test files with source).
26    #[default]
27    Auto,
28    /// Create individual task per file.
29    Never,
30    /// Group all files in same module/directory.
31    Aggressive,
32}
33
34/// Task priority argument for CLI.
35#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
36#[clap(rename_all = "snake_case")]
37pub enum TaskPriorityArg {
38    Critical,
39    High,
40    Medium,
41    Low,
42}
43
44impl From<TaskPriorityArg> for TaskPriority {
45    fn from(value: TaskPriorityArg) -> Self {
46        match value {
47            TaskPriorityArg::Critical => TaskPriority::Critical,
48            TaskPriorityArg::High => TaskPriority::High,
49            TaskPriorityArg::Medium => TaskPriority::Medium,
50            TaskPriorityArg::Low => TaskPriority::Low,
51        }
52    }
53}
54
55/// Task status argument for CLI.
56#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)]
57#[clap(rename_all = "snake_case")]
58pub enum TaskStatusArg {
59    /// Task is a draft and not ready to run.
60    Draft,
61    /// Task is waiting to be started.
62    Todo,
63    /// Task is currently being worked on.
64    Doing,
65    /// Task is complete (terminal, archived).
66    Done,
67    /// Task was rejected (terminal, archived).
68    Rejected,
69}
70
71impl From<TaskStatusArg> for TaskStatus {
72    fn from(value: TaskStatusArg) -> Self {
73        match value {
74            TaskStatusArg::Draft => TaskStatus::Draft,
75            TaskStatusArg::Todo => TaskStatus::Todo,
76            TaskStatusArg::Doing => TaskStatus::Doing,
77            TaskStatusArg::Done => TaskStatus::Done,
78            TaskStatusArg::Rejected => TaskStatus::Rejected,
79        }
80    }
81}
82
83/// Output format for task decomposition.
84#[derive(ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
85#[clap(rename_all = "snake_case")]
86pub enum TaskDecomposeFormatArg {
87    #[default]
88    Text,
89    Json,
90}
91
92/// Existing-child behavior for task decomposition writes.
93#[derive(ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
94#[clap(rename_all = "snake_case")]
95pub enum TaskDecomposeChildPolicyArg {
96    #[default]
97    Fail,
98    Append,
99    Replace,
100}
101
102/// Task edit field argument for CLI.
103#[derive(ValueEnum, Clone, Copy, Debug, PartialEq)]
104#[clap(rename_all = "snake_case")]
105pub enum TaskEditFieldArg {
106    Title,
107    Status,
108    Priority,
109    Tags,
110    Scope,
111    Evidence,
112    Plan,
113    Notes,
114    Request,
115    DependsOn,
116    Blocks,
117    RelatesTo,
118    Duplicates,
119    CustomFields,
120    Agent,
121    CreatedAt,
122    UpdatedAt,
123    CompletedAt,
124    StartedAt,
125    ScheduledStart,
126    EstimatedMinutes,
127    ActualMinutes,
128}
129
130impl TaskEditFieldArg {
131    pub fn as_str(self) -> &'static str {
132        match self {
133            TaskEditFieldArg::Title => "title",
134            TaskEditFieldArg::Status => "status",
135            TaskEditFieldArg::Priority => "priority",
136            TaskEditFieldArg::Tags => "tags",
137            TaskEditFieldArg::Scope => "scope",
138            TaskEditFieldArg::Evidence => "evidence",
139            TaskEditFieldArg::Plan => "plan",
140            TaskEditFieldArg::Notes => "notes",
141            TaskEditFieldArg::Request => "request",
142            TaskEditFieldArg::DependsOn => "depends_on",
143            TaskEditFieldArg::Blocks => "blocks",
144            TaskEditFieldArg::RelatesTo => "relates_to",
145            TaskEditFieldArg::Duplicates => "duplicates",
146            TaskEditFieldArg::CustomFields => "custom_fields",
147            TaskEditFieldArg::Agent => "agent",
148            TaskEditFieldArg::CreatedAt => "created_at",
149            TaskEditFieldArg::UpdatedAt => "updated_at",
150            TaskEditFieldArg::CompletedAt => "completed_at",
151            TaskEditFieldArg::StartedAt => "started_at",
152            TaskEditFieldArg::ScheduledStart => "scheduled_start",
153            TaskEditFieldArg::EstimatedMinutes => "estimated_minutes",
154            TaskEditFieldArg::ActualMinutes => "actual_minutes",
155        }
156    }
157}
158
159impl From<TaskEditFieldArg> for TaskEditKey {
160    fn from(value: TaskEditFieldArg) -> Self {
161        match value {
162            TaskEditFieldArg::Title => TaskEditKey::Title,
163            TaskEditFieldArg::Status => TaskEditKey::Status,
164            TaskEditFieldArg::Priority => TaskEditKey::Priority,
165            TaskEditFieldArg::Tags => TaskEditKey::Tags,
166            TaskEditFieldArg::Scope => TaskEditKey::Scope,
167            TaskEditFieldArg::Evidence => TaskEditKey::Evidence,
168            TaskEditFieldArg::Plan => TaskEditKey::Plan,
169            TaskEditFieldArg::Notes => TaskEditKey::Notes,
170            TaskEditFieldArg::Request => TaskEditKey::Request,
171            TaskEditFieldArg::DependsOn => TaskEditKey::DependsOn,
172            TaskEditFieldArg::Blocks => TaskEditKey::Blocks,
173            TaskEditFieldArg::RelatesTo => TaskEditKey::RelatesTo,
174            TaskEditFieldArg::Duplicates => TaskEditKey::Duplicates,
175            TaskEditFieldArg::CustomFields => TaskEditKey::CustomFields,
176            TaskEditFieldArg::Agent => TaskEditKey::Agent,
177            TaskEditFieldArg::CreatedAt => TaskEditKey::CreatedAt,
178            TaskEditFieldArg::UpdatedAt => TaskEditKey::UpdatedAt,
179            TaskEditFieldArg::CompletedAt => TaskEditKey::CompletedAt,
180            TaskEditFieldArg::StartedAt => TaskEditKey::StartedAt,
181            TaskEditFieldArg::ScheduledStart => TaskEditKey::ScheduledStart,
182            TaskEditFieldArg::EstimatedMinutes => TaskEditKey::EstimatedMinutes,
183            TaskEditFieldArg::ActualMinutes => TaskEditKey::ActualMinutes,
184        }
185    }
186}