mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-26 12:17:19 +02:00
Add error message support
This commit is contained in:
parent
3c6bb5f03f
commit
e71c59e8b3
2 changed files with 79 additions and 44 deletions
80
src/app.rs
80
src/app.rs
|
@ -1,9 +1,10 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Result;
|
|
||||||
use shlex;
|
use shlex;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::result::Result;
|
||||||
|
|
||||||
use task_hookrs::date::Date;
|
use task_hookrs::date::Date;
|
||||||
use task_hookrs::import::import;
|
use task_hookrs::import::import;
|
||||||
|
@ -93,6 +94,7 @@ pub enum AppMode {
|
||||||
LogTask,
|
LogTask,
|
||||||
ModifyTask,
|
ModifyTask,
|
||||||
HelpPopup,
|
HelpPopup,
|
||||||
|
TaskError,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct App {
|
pub struct App {
|
||||||
|
@ -100,6 +102,7 @@ pub struct App {
|
||||||
pub state: TableState,
|
pub state: TableState,
|
||||||
pub filter: String,
|
pub filter: String,
|
||||||
pub command: String,
|
pub command: String,
|
||||||
|
pub error: String,
|
||||||
pub modify: String,
|
pub modify: String,
|
||||||
pub tasks: Vec<Task>,
|
pub tasks: Vec<Task>,
|
||||||
pub task_report_labels: Vec<String>,
|
pub task_report_labels: Vec<String>,
|
||||||
|
@ -118,6 +121,7 @@ impl App {
|
||||||
filter: "status:pending ".to_string(),
|
filter: "status:pending ".to_string(),
|
||||||
command: "".to_string(),
|
command: "".to_string(),
|
||||||
modify: "".to_string(),
|
modify: "".to_string(),
|
||||||
|
error: "".to_string(),
|
||||||
mode: AppMode::Report,
|
mode: AppMode::Report,
|
||||||
};
|
};
|
||||||
app.update();
|
app.update();
|
||||||
|
@ -190,6 +194,10 @@ impl App {
|
||||||
f.render_widget(Clear, rects[1]);
|
f.render_widget(Clear, rects[1]);
|
||||||
self.draw_command(f, rects[1], &self.command[..], "Add Task");
|
self.draw_command(f, rects[1], &self.command[..], "Add Task");
|
||||||
},
|
},
|
||||||
|
AppMode::TaskError => {
|
||||||
|
f.render_widget(Clear, rects[1]);
|
||||||
|
self.draw_command(f, rects[1], &self.error[..], "Error");
|
||||||
|
},
|
||||||
AppMode::HelpPopup => {
|
AppMode::HelpPopup => {
|
||||||
self.draw_command(f, rects[1], &self.filter[..], "Filter Tasks");
|
self.draw_command(f, rects[1], &self.filter[..], "Filter Tasks");
|
||||||
self.draw_help_popup(f, f.size());
|
self.draw_help_popup(f, f.size());
|
||||||
|
@ -500,23 +508,38 @@ impl App {
|
||||||
self.update();
|
self.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_log(&mut self) {
|
pub fn task_log(&mut self) -> Result<(), String> {
|
||||||
if self.tasks.len() == 0 {
|
if self.tasks.len() == 0 {
|
||||||
return
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let output = Command::new("task")
|
let mut command = Command::new("task");
|
||||||
.arg("log")
|
|
||||||
.arg(format!("{}", self.command))
|
command
|
||||||
|
.arg("log");
|
||||||
|
|
||||||
|
match shlex::split(&self.command) {
|
||||||
|
Some(cmd) => {
|
||||||
|
for s in cmd {
|
||||||
|
command.arg(&s);
|
||||||
|
}
|
||||||
|
let output = command
|
||||||
.output()
|
.output()
|
||||||
.expect("Cannot run `task log`. Check documentation for more information");
|
.expect("Cannot run `task log`. Check documentation for more information");
|
||||||
|
|
||||||
self.command = "".to_string();
|
self.command = "".to_string();
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Err(format!("Unable to run `task log` with `{}`", &self.command));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_modify(&mut self) {
|
}
|
||||||
|
|
||||||
|
pub fn task_modify(&mut self) -> Result<(), String> {
|
||||||
if self.tasks.len() == 0 {
|
if self.tasks.len() == 0 {
|
||||||
return
|
return Ok(());
|
||||||
}
|
}
|
||||||
let selected = self.state.selected().unwrap_or_default();
|
let selected = self.state.selected().unwrap_or_default();
|
||||||
let task_id = self.tasks[selected].id().unwrap_or_default();
|
let task_id = self.tasks[selected].id().unwrap_or_default();
|
||||||
|
@ -530,22 +553,22 @@ impl App {
|
||||||
for s in cmd {
|
for s in cmd {
|
||||||
command.arg(&s);
|
command.arg(&s);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
None => {
|
|
||||||
command.arg("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let output = command
|
let output = command
|
||||||
.output()
|
.output()
|
||||||
.expect("Cannot run `task modify`. Check documentation for more information");
|
.expect("Cannot run `task modify`. Check documentation for more information");
|
||||||
|
|
||||||
self.modify = "".to_string();
|
self.modify = "".to_string();
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Err(format!("Unable to run `task modify` with `{}` on task {}", &self.modify, &task_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_add(&mut self) {
|
pub fn task_add(&mut self) -> Result<(), String> {
|
||||||
if self.tasks.len() == 0 {
|
if self.tasks.len() == 0 {
|
||||||
return
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut command = Command::new("task");
|
let mut command = Command::new("task");
|
||||||
|
@ -557,17 +580,17 @@ impl App {
|
||||||
for s in cmd {
|
for s in cmd {
|
||||||
command.arg(&s);
|
command.arg(&s);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
None => {
|
|
||||||
command.arg("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let output = command
|
let output = command
|
||||||
.output()
|
.output()
|
||||||
.expect("Cannot run `task add`. Check documentation for more information");
|
.expect("Cannot run `task add`. Check documentation for more information");
|
||||||
|
|
||||||
self.command = "".to_string();
|
self.command = "".to_string();
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Err(format!("Unable to run `task add` with `{}`", &self.command));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_virtual_tags(& self) -> String {
|
pub fn task_virtual_tags(& self) -> String {
|
||||||
|
@ -730,17 +753,8 @@ mod tests {
|
||||||
let (t, h, c) = app.task_report();
|
let (t, h, c) = app.task_report();
|
||||||
app.next();
|
app.next();
|
||||||
app.next();
|
app.next();
|
||||||
let selected = app.state.selected().unwrap_or_default();
|
app.modify = "Cannot add this string ' because it has a single quote".to_string();
|
||||||
let task_id = app.tasks[selected].id().unwrap_or_default();
|
println!("{}", app.modify);
|
||||||
let mut command = "start";
|
|
||||||
for tag in app.tasks[selected].tags().unwrap_or(&vec![]) {
|
|
||||||
if tag == "ACTIVE" {
|
|
||||||
command = "stop"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
println!("{:?}", app.tasks[selected]);
|
|
||||||
println!("{:?}", app.tasks[selected].tags().unwrap_or(&vec![]));
|
|
||||||
println!("{}", app.task_virtual_tags());
|
|
||||||
// if let Ok(tasks) = import(stdin()) {
|
// if let Ok(tasks) = import(stdin()) {
|
||||||
// for task in tasks {
|
// for task in tasks {
|
||||||
// println!("Task: {}, entered {:?} is {} -> {}",
|
// println!("Task: {}, entered {:?} is {} -> {}",
|
||||||
|
|
33
src/main.rs
33
src/main.rs
|
@ -92,8 +92,13 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
}
|
}
|
||||||
AppMode::ModifyTask => match input {
|
AppMode::ModifyTask => match input {
|
||||||
Key::Char('\n') => {
|
Key::Char('\n') => {
|
||||||
app.task_modify();
|
match app.task_modify() {
|
||||||
app.mode = AppMode::Report;
|
Ok(_) => app.mode = AppMode::Report,
|
||||||
|
Err(e) => {
|
||||||
|
app.mode = AppMode::TaskError;
|
||||||
|
app.error = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Key::Esc => {
|
Key::Esc => {
|
||||||
app.modify = "".to_string();
|
app.modify = "".to_string();
|
||||||
|
@ -109,8 +114,13 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
},
|
},
|
||||||
AppMode::LogTask => match input {
|
AppMode::LogTask => match input {
|
||||||
Key::Char('\n') => {
|
Key::Char('\n') => {
|
||||||
app.task_log();
|
match app.task_log() {
|
||||||
app.mode = AppMode::Report;
|
Ok(_) => app.mode = AppMode::Report,
|
||||||
|
Err(e) => {
|
||||||
|
app.mode = AppMode::TaskError;
|
||||||
|
app.error = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Key::Esc => {
|
Key::Esc => {
|
||||||
app.command = "".to_string();
|
app.command = "".to_string();
|
||||||
|
@ -126,8 +136,13 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
},
|
},
|
||||||
AppMode::AddTask => match input {
|
AppMode::AddTask => match input {
|
||||||
Key::Char('\n') => {
|
Key::Char('\n') => {
|
||||||
app.task_add();
|
match app.task_add() {
|
||||||
app.mode = AppMode::Report;
|
Ok(_) => app.mode = AppMode::Report,
|
||||||
|
Err(e) => {
|
||||||
|
app.mode = AppMode::TaskError;
|
||||||
|
app.error = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Key::Esc => {
|
Key::Esc => {
|
||||||
app.command = "".to_string();
|
app.command = "".to_string();
|
||||||
|
@ -153,6 +168,12 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
|
AppMode::TaskError => match input {
|
||||||
|
Key::Esc => {
|
||||||
|
app.mode = AppMode::Report;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Tick => app.handle_tick(),
|
Event::Tick => app.handle_tick(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue