use super::super::state::{PanelId, TuiMode};
use super::super::views::{TuiView, ViewAction};
#[derive(Debug, Clone, PartialEq)]
#[allow(dead_code)]
pub enum Action {
Continue,
Quit,
TogglePause,
Step,
FocusNext,
FocusPrev,
FocusPanel(u8),
CycleTab,
SetMode(TuiMode),
ScrollUp,
ScrollDown,
ScrollToTop,
ScrollToBottom,
CopyToClipboard,
RetryWorkflow,
ExportTrace,
ToggleBreakpoint,
ToggleTheme,
MouseClickPanel(PanelId),
MouseScrollUp,
MouseScrollDown,
DismissNotification,
DismissAllNotifications,
DismissError,
EnterFilter,
ExitFilter,
FilterInput(char),
FilterBackspace,
FilterDelete,
FilterCursorLeft,
FilterCursorRight,
FilterClear,
SettingsNextField,
SettingsPrevField,
SettingsToggleEdit,
SettingsInput(char),
SettingsBackspace,
SettingsDelete,
SettingsCancelEdit,
SettingsSave,
SettingsCursorLeft,
SettingsCursorRight,
SwitchView(TuiView),
ViewSpecific(ViewAction),
}
impl Action {
pub fn from_view_action(view_action: ViewAction) -> Self {
match view_action {
ViewAction::None => Action::Continue,
ViewAction::Quit => Action::Quit,
ViewAction::SwitchView(view) => Action::SwitchView(view),
ViewAction::ToggleTheme => Action::ToggleTheme,
ViewAction::OpenControl => Action::SwitchView(TuiView::Control),
ViewAction::ChatInfer(_)
| ViewAction::ChatExec(_)
| ViewAction::ChatFetch(_, _)
| ViewAction::ChatInvoke(_, _, _)
| ViewAction::ChatAgent(_, _, _, _)
| ViewAction::ChatClear
| ViewAction::ChatModelSwitch(_)
| ViewAction::ChatMcp(_)
| ViewAction::RunWorkflow(_)
| ViewAction::OpenInStudio(_)
| ViewAction::ValidateWorkflow(_)
| ViewAction::SendChatMessage(_)
| ViewAction::SetTheme(_)
| ViewAction::VerifyProviders
| ViewAction::RefreshVerification
| ViewAction::ProviderSelectorConfirm { .. }
| ViewAction::PullNativeModel(_)
| ViewAction::DeleteNativeModel(_)
| ViewAction::RefreshNativeModels
| ViewAction::LaunchWizard
| ViewAction::Error(_) => Action::ViewSpecific(view_action),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_action_equality() {
assert_eq!(Action::Quit, Action::Quit);
assert_eq!(Action::Continue, Action::Continue);
assert_ne!(Action::Quit, Action::Continue);
}
#[test]
fn test_action_clone() {
let action = Action::FilterInput('a');
let cloned = action.clone();
assert_eq!(action, cloned);
}
#[test]
fn test_from_view_action_none() {
let result = Action::from_view_action(ViewAction::None);
assert_eq!(result, Action::Continue);
}
#[test]
fn test_from_view_action_quit() {
let result = Action::from_view_action(ViewAction::Quit);
assert_eq!(result, Action::Quit);
}
#[test]
fn test_from_view_action_toggle_theme() {
let result = Action::from_view_action(ViewAction::ToggleTheme);
assert_eq!(result, Action::ToggleTheme);
}
#[test]
fn test_from_view_action_open_settings() {
let result = Action::from_view_action(ViewAction::OpenControl);
assert_eq!(result, Action::SwitchView(TuiView::Control));
}
#[test]
fn test_from_view_action_switch_view() {
let result = Action::from_view_action(ViewAction::SwitchView(TuiView::Command));
assert_eq!(result, Action::SwitchView(TuiView::Command));
}
#[test]
fn test_from_view_action_chat_infer() {
let prompt = "test prompt".to_string();
let result = Action::from_view_action(ViewAction::ChatInfer(prompt.clone()));
match result {
Action::ViewSpecific(ViewAction::ChatInfer(p)) => assert_eq!(p, prompt),
_ => panic!("Expected ViewSpecific(ChatInfer)"),
}
}
#[test]
fn test_from_view_action_launch_wizard() {
let result = Action::from_view_action(ViewAction::LaunchWizard);
match result {
Action::ViewSpecific(ViewAction::LaunchWizard) => {}
_ => panic!("Expected ViewSpecific(LaunchWizard)"),
}
}
#[test]
fn test_action_debug_format() {
let action = Action::Quit;
let debug_str = format!("{:?}", action);
assert!(debug_str.contains("Quit"));
}
#[test]
fn test_filter_actions() {
let action = Action::FilterInput('x');
match action {
Action::FilterInput(c) => assert_eq!(c, 'x'),
_ => panic!("Expected FilterInput"),
}
}
#[test]
fn test_focus_panel_action() {
let action = Action::FocusPanel(2);
match action {
Action::FocusPanel(n) => assert_eq!(n, 2),
_ => panic!("Expected FocusPanel"),
}
}
#[test]
fn test_mouse_click_panel() {
let action = Action::MouseClickPanel(PanelId::Dag);
match action {
Action::MouseClickPanel(panel) => assert_eq!(panel, PanelId::Dag),
_ => panic!("Expected MouseClickPanel"),
}
}
}