1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use {
crate::{
app_context::AppContext,
browser_states::BrowserState,
commands::Command,
errors::{ProgramError, TreeBuildError},
external::Launchable,
screens::Screen,
task_sync::TaskLifetime,
},
std::io::Write,
};
pub enum AppStateCmdResult {
Quit,
Keep,
Launch(Box<Launchable>),
DisplayError(String),
NewState(Box<dyn AppState>, Command),
PopStateAndReapply,
PopState,
RefreshState { clear_cache: bool },
}
impl AppStateCmdResult {
pub fn verb_not_found(text: &str) -> AppStateCmdResult {
AppStateCmdResult::DisplayError(format!("verb not found: {:?}", &text))
}
pub fn from_optional_state(
os: Result<Option<BrowserState>, TreeBuildError>,
cmd: Command,
) -> AppStateCmdResult {
match os {
Ok(Some(os)) => AppStateCmdResult::NewState(Box::new(os), cmd),
Ok(None) => AppStateCmdResult::Keep,
Err(e) => AppStateCmdResult::DisplayError(e.to_string()),
}
}
}
impl From<Launchable> for AppStateCmdResult {
fn from(launchable: Launchable) -> Self {
AppStateCmdResult::Launch(Box::new(launchable))
}
}
pub trait AppState {
fn apply(
&mut self,
cmd: &mut Command,
screen: &mut Screen,
con: &AppContext,
) -> Result<AppStateCmdResult, ProgramError>;
fn can_execute(&self, verb_index: usize, con: &AppContext) -> bool;
fn refresh(&mut self, screen: &Screen, con: &AppContext) -> Command;
fn do_pending_task(&mut self, screen: &mut Screen, tl: &TaskLifetime);
fn has_pending_task(&self) -> bool;
fn display(
&mut self,
w: &mut dyn Write,
screen: &Screen,
con: &AppContext,
) -> Result<(), ProgramError>;
fn write_flags(
&self,
w: &mut dyn Write,
screen: &mut Screen,
con: &AppContext,
) -> Result<(), ProgramError>;
fn write_status(
&self,
w: &mut dyn Write,
cmd: &Command,
screen: &Screen,
con: &AppContext,
) -> Result<(), ProgramError>;
}