fix: Better error reporting

This commit is contained in:
Dheepak Krishnamurthy 2021-11-09 08:42:21 -07:00
parent c1cc6068d7
commit d0f3a05de7

View file

@ -50,7 +50,7 @@ use tui::{
style::{Color, Modifier, Style}, style::{Color, Modifier, Style},
terminal::Frame, terminal::Frame,
text::{Span, Spans, Text}, text::{Span, Spans, Text},
widgets::{Block, BorderType, Borders, Clear, List, ListItem, Paragraph}, widgets::{Block, BorderType, Borders, Clear, List, ListItem, Paragraph, Wrap},
}; };
use rustyline::history::Direction as HistoryDirection; use rustyline::history::Direction as HistoryDirection;
@ -690,11 +690,29 @@ impl TaskwarriorTui {
Self::draw_command( Self::draw_command(
f, f,
rects[1], rects[1],
self.error.as_str(), "Press ESC to return",
Span::styled("Error", Style::default().add_modifier(Modifier::BOLD)), Span::styled("Error", Style::default().add_modifier(Modifier::BOLD)),
0, 0,
false, false,
); );
let text = self.error.as_str();
let title = vec![Span::styled("Error", Style::default().add_modifier(Modifier::BOLD))];
let rect = centered_rect(90, 60, f.size());
f.render_widget(Clear, rect);
let p = Paragraph::new(Text::from(text))
.block(
Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Rounded)
.title(title),
)
.wrap(Wrap { trim: true });
f.render_widget(p, rect);
// draw error pop up
let rects = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(0)].as_ref())
.split(f.size());
} }
Mode::Tasks(Action::HelpPopup) => { Mode::Tasks(Action::HelpPopup) => {
Self::draw_command( Self::draw_command(
@ -1565,8 +1583,8 @@ impl TaskwarriorTui {
pub fn export_tasks(&mut self) -> Result<()> { pub fn export_tasks(&mut self) -> Result<()> {
let mut task = Command::new("task"); let mut task = Command::new("task");
// task.arg("rc.json.array=on"); task.arg("rc.json.array=on");
// task.arg("rc.confirmation=off"); task.arg("rc.confirmation=off");
if !self.filter.as_str().trim().is_empty() { if !self.filter.as_str().trim().is_empty() {
if let Some(args) = shlex::split(self.filter.as_str().trim()) { if let Some(args) = shlex::split(self.filter.as_str().trim()) {
@ -1592,10 +1610,13 @@ impl TaskwarriorTui {
let data = String::from_utf8_lossy(&output.stdout); let data = String::from_utf8_lossy(&output.stdout);
let error = String::from_utf8_lossy(&output.stderr); let error = String::from_utf8_lossy(&output.stderr);
if !error.contains("The expression could not be evaluated.") { if output.status.success() {
if let Ok(imported) = import(data.as_bytes()) { if let Ok(imported) = import(data.as_bytes()) {
self.tasks = imported; self.tasks = imported;
} }
} else {
self.mode = Mode::Tasks(Action::Error);
self.error = format!("Running `{:?}` failed ({}): {}", &task, output.status, error);
} }
Ok(()) Ok(())
@ -4440,8 +4461,6 @@ mod tests {
fn test_app() { fn test_app() {
let mut app = TaskwarriorTui::new("next").unwrap(); let mut app = TaskwarriorTui::new("next").unwrap();
app.update(true).unwrap();
let backend = TestBackend::new(80, 20); let backend = TestBackend::new(80, 20);
let mut terminal = Terminal::new(backend).unwrap(); let mut terminal = Terminal::new(backend).unwrap();
app.render(&mut terminal).unwrap(); app.render(&mut terminal).unwrap();