summaryrefslogtreecommitdiff
path: root/src/run.rs
blob: 9c504b534561b1eb23787914b5e233f3da8ecdd9 (plain)
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
use anyhow::{bail, Result};
use crossterm::style::Stylize;
use std::io::{self, Write};

use crate::app_state::{AppState, ExercisesProgress};

pub fn run(app_state: &mut AppState) -> Result<()> {
    let exercise = app_state.current_exercise();
    let output = exercise.run()?;

    let mut stdout = io::stdout().lock();
    stdout.write_all(&output.stdout)?;
    stdout.write_all(b"\n")?;
    stdout.write_all(&output.stderr)?;
    stdout.flush()?;

    if !output.status.success() {
        app_state.set_pending(app_state.current_exercise_ind())?;

        bail!("Ran {} with errors", app_state.current_exercise());
    }

    stdout.write_fmt(format_args!(
        "{}{}\n",
        "✓ Successfully ran ".green(),
        exercise.path.to_string_lossy().green(),
    ))?;

    match app_state.done_current_exercise(&mut stdout)? {
        ExercisesProgress::AllDone => (),
        ExercisesProgress::Pending => println!("Next exercise: {}", app_state.current_exercise()),
    }

    Ok(())
}