Skip to main content

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}