ralph_workflow/cli/reducer/event.rs
1//! CLI processing events.
2//!
3//! This module defines all possible events that can occur during CLI argument processing.
4//! Events are data carriers that contain only the information needed to compute new state.
5
6use serde::{Deserialize, Serialize};
7
8/// CLI processing events.
9///
10/// Each event represents a discrete CLI argument or flag being processed.
11/// Events are processed in order, with later events taking precedence
12/// (last-wins semantics for conflicting options like presets).
13#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
14pub enum CliEvent {
15 // ===== Verbosity Events =====
16 /// Explicit verbosity level set via -v/--verbosity
17 VerbositySet {
18 /// Verbosity level (0-4)
19 level: u8,
20 },
21 /// Quiet mode enabled via --quiet
22 QuietModeEnabled,
23 /// Full mode enabled via --full
24 FullModeEnabled,
25 /// Debug mode enabled via --debug
26 DebugModeEnabled,
27
28 // ===== Preset Events =====
29 /// Quick preset applied via -Q/--quick (1 dev, 1 review)
30 QuickPresetApplied,
31 /// Rapid preset applied via -U/--rapid (2 dev, 1 review)
32 RapidPresetApplied,
33 /// Long preset applied via -L/--long (15 dev, 10 review)
34 LongPresetApplied,
35 /// Standard preset applied via -S/--standard (5 dev, 2 review)
36 StandardPresetApplied,
37 /// Thorough preset applied via -T/--thorough (10 dev, 5 review)
38 ThoroughPresetApplied,
39
40 // ===== Iteration Count Events =====
41 /// Developer iterations explicitly set via -D/--developer-iters
42 DeveloperItersSet {
43 /// Number of developer iterations
44 value: u32,
45 },
46 /// Reviewer reviews explicitly set via -R/--reviewer-reviews
47 ReviewerReviewsSet {
48 /// Number of reviewer review passes
49 value: u32,
50 },
51
52 // ===== Agent Selection Events =====
53 /// Developer agent set via -a/--developer-agent
54 DeveloperAgentSet {
55 /// Agent name
56 agent: String,
57 },
58 /// Reviewer agent set via -r/--reviewer-agent
59 ReviewerAgentSet {
60 /// Agent name
61 agent: String,
62 },
63 /// Developer model set via --developer-model
64 DeveloperModelSet {
65 /// Model identifier
66 model: String,
67 },
68 /// Reviewer model set via --reviewer-model
69 ReviewerModelSet {
70 /// Model identifier
71 model: String,
72 },
73 /// Developer provider set via --developer-provider
74 DeveloperProviderSet {
75 /// Provider name
76 provider: String,
77 },
78 /// Reviewer provider set via --reviewer-provider
79 ReviewerProviderSet {
80 /// Provider name
81 provider: String,
82 },
83 /// Reviewer JSON parser set via --reviewer-json-parser
84 ReviewerJsonParserSet {
85 /// Parser name
86 parser: String,
87 },
88
89 // ===== Configuration Events =====
90 /// Isolation mode disabled via --no-isolation
91 IsolationModeDisabled,
92 /// Review depth set via --review-depth
93 ReviewDepthSet {
94 /// Depth level (standard, comprehensive, security, incremental)
95 depth: String,
96 },
97 /// Git user name set via --git-user-name
98 GitUserNameSet {
99 /// User name for commits
100 name: String,
101 },
102 /// Git user email set via --git-user-email
103 GitUserEmailSet {
104 /// User email for commits
105 email: String,
106 },
107 /// Streaming metrics enabled via --show-streaming-metrics
108 StreamingMetricsEnabled,
109
110 // ===== Agent Preset Events =====
111 /// Named preset for agent combinations (default, opencode)
112 AgentPresetSet {
113 /// Preset name
114 preset: String,
115 },
116
117 // ===== Finalization =====
118 /// CLI processing complete
119 CliProcessingComplete,
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125
126 #[test]
127 fn test_event_serialization() {
128 let event = CliEvent::QuickPresetApplied;
129 let json = serde_json::to_string(&event).unwrap();
130 let deserialized: CliEvent = serde_json::from_str(&json).unwrap();
131 assert_eq!(event, deserialized);
132 }
133
134 #[test]
135 fn test_event_with_data_serialization() {
136 let event = CliEvent::DeveloperItersSet { value: 10 };
137 let json = serde_json::to_string(&event).unwrap();
138 assert!(json.contains("10"));
139 let deserialized: CliEvent = serde_json::from_str(&json).unwrap();
140 assert_eq!(event, deserialized);
141 }
142
143 #[test]
144 fn test_all_preset_events_distinct() {
145 let presets = vec![
146 CliEvent::QuickPresetApplied,
147 CliEvent::RapidPresetApplied,
148 CliEvent::LongPresetApplied,
149 CliEvent::StandardPresetApplied,
150 CliEvent::ThoroughPresetApplied,
151 ];
152
153 // Ensure all presets are distinct
154 for (i, p1) in presets.iter().enumerate() {
155 for (j, p2) in presets.iter().enumerate() {
156 if i != j {
157 assert_ne!(p1, p2);
158 }
159 }
160 }
161 }
162}