diff options
Diffstat (limited to 'src/command.rs')
-rw-r--r-- | src/command.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/command.rs b/src/command.rs new file mode 100644 index 0000000..5391266 --- /dev/null +++ b/src/command.rs | |||
@@ -0,0 +1,49 @@ | |||
1 | use cursive::view::Resizable; | ||
2 | use cursive::views::{Dialog, EditView}; | ||
3 | use cursive::Cursive; | ||
4 | |||
5 | use crate::app::App; | ||
6 | |||
7 | pub fn open_command_window(s: &mut Cursive) { | ||
8 | let command_window = Dialog::around(EditView::new().on_submit(call_on_app).fixed_width(40)); | ||
9 | s.add_layer(command_window); | ||
10 | } | ||
11 | |||
12 | fn call_on_app(s: &mut Cursive, input: &str) { | ||
13 | s.call_on_name("Main", |view: &mut App| { | ||
14 | view.parse_command(input); | ||
15 | }); | ||
16 | s.pop_layer(); | ||
17 | } | ||
18 | |||
19 | pub enum Command { | ||
20 | Add(String, String, Option<u32>), | ||
21 | Delete, | ||
22 | Blank, | ||
23 | } | ||
24 | |||
25 | impl Command { | ||
26 | pub fn from_string<P: AsRef<str>>(input: P) -> Self { | ||
27 | let mut strings: Vec<&str> = input.as_ref().trim().split(' ').collect(); | ||
28 | if strings.is_empty() { | ||
29 | return Command::Blank; | ||
30 | } | ||
31 | |||
32 | let first = strings.first().unwrap().to_string(); | ||
33 | let mut args: Vec<String> = strings.iter_mut().skip(1).map(|s| s.to_string()).collect(); | ||
34 | match first.as_ref() { | ||
35 | "add" | "a" => { | ||
36 | if args.len() < 2 { | ||
37 | return Command::Blank; | ||
38 | } | ||
39 | let goal = args.get(2).map(|g| g.parse::<u32>().ok()).flatten(); | ||
40 | return Command::Add( | ||
41 | args.get_mut(0).unwrap().to_string(), | ||
42 | args.get_mut(1).unwrap().to_string(), | ||
43 | goal, | ||
44 | ); | ||
45 | } | ||
46 | _ => return Command::Blank, | ||
47 | } | ||
48 | } | ||
49 | } | ||