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