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    Description,
108    Status,
109    Priority,
110    Tags,
111    Scope,
112    Evidence,
113    Plan,
114    Notes,
115    Request,
116    DependsOn,
117    Blocks,
118    RelatesTo,
119    Duplicates,
120    CustomFields,
121    Agent,
122    CreatedAt,
123    UpdatedAt,
124    CompletedAt,
125    StartedAt,
126    ScheduledStart,
127    EstimatedMinutes,
128    ActualMinutes,
129}
130
131impl TaskEditFieldArg {
132    pub fn as_str(self) -> &'static str {
133        match self {
134            TaskEditFieldArg::Title => "title",
135            TaskEditFieldArg::Description => "description",
136            TaskEditFieldArg::Status => "status",
137            TaskEditFieldArg::Priority => "priority",
138            TaskEditFieldArg::Tags => "tags",
139            TaskEditFieldArg::Scope => "scope",
140            TaskEditFieldArg::Evidence => "evidence",
141            TaskEditFieldArg::Plan => "plan",
142            TaskEditFieldArg::Notes => "notes",
143            TaskEditFieldArg::Request => "request",
144            TaskEditFieldArg::DependsOn => "depends_on",
145            TaskEditFieldArg::Blocks => "blocks",
146            TaskEditFieldArg::RelatesTo => "relates_to",
147            TaskEditFieldArg::Duplicates => "duplicates",
148            TaskEditFieldArg::CustomFields => "custom_fields",
149            TaskEditFieldArg::Agent => "agent",
150            TaskEditFieldArg::CreatedAt => "created_at",
151            TaskEditFieldArg::UpdatedAt => "updated_at",
152            TaskEditFieldArg::CompletedAt => "completed_at",
153            TaskEditFieldArg::StartedAt => "started_at",
154            TaskEditFieldArg::ScheduledStart => "scheduled_start",
155            TaskEditFieldArg::EstimatedMinutes => "estimated_minutes",
156            TaskEditFieldArg::ActualMinutes => "actual_minutes",
157        }
158    }
159}
160
161impl From<TaskEditFieldArg> for TaskEditKey {
162    fn from(value: TaskEditFieldArg) -> Self {
163        match value {
164            TaskEditFieldArg::Title => TaskEditKey::Title,
165            TaskEditFieldArg::Description => TaskEditKey::Description,
166            TaskEditFieldArg::Status => TaskEditKey::Status,
167            TaskEditFieldArg::Priority => TaskEditKey::Priority,
168            TaskEditFieldArg::Tags => TaskEditKey::Tags,
169            TaskEditFieldArg::Scope => TaskEditKey::Scope,
170            TaskEditFieldArg::Evidence => TaskEditKey::Evidence,
171            TaskEditFieldArg::Plan => TaskEditKey::Plan,
172            TaskEditFieldArg::Notes => TaskEditKey::Notes,
173            TaskEditFieldArg::Request => TaskEditKey::Request,
174            TaskEditFieldArg::DependsOn => TaskEditKey::DependsOn,
175            TaskEditFieldArg::Blocks => TaskEditKey::Blocks,
176            TaskEditFieldArg::RelatesTo => TaskEditKey::RelatesTo,
177            TaskEditFieldArg::Duplicates => TaskEditKey::Duplicates,
178            TaskEditFieldArg::CustomFields => TaskEditKey::CustomFields,
179            TaskEditFieldArg::Agent => TaskEditKey::Agent,
180            TaskEditFieldArg::CreatedAt => TaskEditKey::CreatedAt,
181            TaskEditFieldArg::UpdatedAt => TaskEditKey::UpdatedAt,
182            TaskEditFieldArg::CompletedAt => TaskEditKey::CompletedAt,
183            TaskEditFieldArg::StartedAt => TaskEditKey::StartedAt,
184            TaskEditFieldArg::ScheduledStart => TaskEditKey::ScheduledStart,
185            TaskEditFieldArg::EstimatedMinutes => TaskEditKey::EstimatedMinutes,
186            TaskEditFieldArg::ActualMinutes => TaskEditKey::ActualMinutes,
187        }
188    }
189}