use std::path::PathBuf;
use crossterm::event::Event;
use notify_debouncer_mini::DebouncedEvent;
use crate::vcs::RefreshResult;
use crate::diff::FileDiff;
pub use crate::input::AppAction;
pub const FALLBACK_REFRESH_SECS: u64 = 5;
#[derive(Debug)]
pub struct FetchResult {
pub has_conflicts: bool,
pub new_merge_base: Option<String>,
}
#[derive(Debug)]
pub enum RefreshOutcome {
Success(Box<RefreshResult>),
SingleFile { path: String, diff: Option<FileDiff>, revision_id: Option<String> },
Cancelled,
Error(String),
}
impl RefreshOutcome {
pub fn success(result: RefreshResult) -> Self {
Self::Success(Box::new(result))
}
}
#[derive(Debug)]
pub enum Message {
Input(AppAction),
SearchInput(Event),
RefreshCompleted(Box<RefreshOutcome>),
FileChanged(Vec<DebouncedEvent>),
FetchCompleted(FetchResult),
Tick,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum RefreshTrigger {
#[default]
None,
Full,
SingleFile(PathBuf),
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum LoopAction {
#[default]
Continue,
Quit,
RestartVcs,
}
#[derive(Debug, Default)]
pub struct UpdateResult {
pub loop_action: LoopAction,
pub refresh: RefreshTrigger,
pub trigger_fetch: bool,
pub needs_redraw: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_update_result_default() {
let result = UpdateResult::default();
assert_eq!(result.loop_action, LoopAction::Continue);
assert_eq!(result.refresh, RefreshTrigger::None);
assert!(!result.trigger_fetch);
assert!(!result.needs_redraw);
}
#[test]
fn test_message_variants() {
let _input = Message::Input(AppAction::Quit);
let _refresh = Message::RefreshCompleted(Box::new(RefreshOutcome::Error("test".to_string())));
let _file = Message::FileChanged(vec![]);
let _fetch = Message::FetchCompleted(FetchResult {
has_conflicts: false,
new_merge_base: None,
});
let _tick = Message::Tick;
}
#[test]
fn test_refresh_outcome_variants() {
let _single = RefreshOutcome::SingleFile {
path: "test.rs".to_string(),
diff: None,
revision_id: None,
};
let _cancelled = RefreshOutcome::Cancelled;
let _error = RefreshOutcome::Error("something failed".to_string());
}
#[test]
fn test_fetch_result_with_conflicts() {
let result = FetchResult {
has_conflicts: true,
new_merge_base: Some("abc123".to_string()),
};
assert!(result.has_conflicts);
assert_eq!(result.new_merge_base, Some("abc123".to_string()));
}
}