summaryrefslogtreecommitdiff
path: root/src/watch/state.rs
diff options
context:
space:
mode:
authorMo <76752051+mo8it@users.noreply.github.com>2024-04-25 14:43:28 +0200
committerGitHub <noreply@github.com>2024-04-25 14:43:28 +0200
commit88f27a53771a49a4e541627b84cc5dc7ab6f7357 (patch)
treeeba5401fd370e85cf597771b34a042eb5ae65475 /src/watch/state.rs
parentd8c2ab8349854cbc7f4a994c7413d266cc38bc24 (diff)
parent1f1a62d83ef9398a1a31c904a2ef6d81f5455e59 (diff)
Merge pull request #1959 from rust-lang/output
Improve output
Diffstat (limited to 'src/watch/state.rs')
-rw-r--r--src/watch/state.rs63
1 files changed, 26 insertions, 37 deletions
diff --git a/src/watch/state.rs b/src/watch/state.rs
index 5f4abf3..40c01bf 100644
--- a/src/watch/state.rs
+++ b/src/watch/state.rs
@@ -8,6 +8,7 @@ use std::io::{self, StdoutLock, Write};
use crate::{
app_state::{AppState, ExercisesProgress},
+ exercise::OUTPUT_CAPACITY,
progress_bar::progress_bar,
terminal_link::TerminalFileLink,
};
@@ -21,8 +22,7 @@ enum DoneStatus {
pub struct WatchState<'a> {
writer: StdoutLock<'a>,
app_state: &'a mut AppState,
- stdout: Option<Vec<u8>>,
- stderr: Option<Vec<u8>>,
+ output: Vec<u8>,
show_hint: bool,
done_status: DoneStatus,
manual_run: bool,
@@ -35,8 +35,7 @@ impl<'a> WatchState<'a> {
Self {
writer,
app_state,
- stdout: None,
- stderr: None,
+ output: Vec::with_capacity(OUTPUT_CAPACITY),
show_hint: false,
done_status: DoneStatus::Pending,
manual_run,
@@ -51,11 +50,8 @@ impl<'a> WatchState<'a> {
pub fn run_current_exercise(&mut self) -> Result<()> {
self.show_hint = false;
- let output = self.app_state.current_exercise().run()?;
- self.stdout = Some(output.stdout);
-
- if output.status.success() {
- self.stderr = None;
+ let success = self.app_state.current_exercise().run(&mut self.output)?;
+ if success {
self.done_status =
if let Some(solution_path) = self.app_state.current_solution_path()? {
DoneStatus::DoneWithSolution(solution_path)
@@ -66,7 +62,6 @@ impl<'a> WatchState<'a> {
self.app_state
.set_pending(self.app_state.current_exercise_ind())?;
- self.stderr = Some(output.stderr);
self.done_status = DoneStatus::Pending;
}
@@ -93,19 +88,18 @@ impl<'a> WatchState<'a> {
self.writer.write_all(b"\n")?;
if self.manual_run {
- self.writer.write_fmt(format_args!("{}un/", 'r'.bold()))?;
+ write!(self.writer, "{}un/", 'r'.bold())?;
}
if !matches!(self.done_status, DoneStatus::Pending) {
- self.writer.write_fmt(format_args!("{}ext/", 'n'.bold()))?;
+ write!(self.writer, "{}ext/", 'n'.bold())?;
}
if !self.show_hint {
- self.writer.write_fmt(format_args!("{}int/", 'h'.bold()))?;
+ write!(self.writer, "{}int/", 'h'.bold())?;
}
- self.writer
- .write_fmt(format_args!("{}ist/{}uit? ", 'l'.bold(), 'q'.bold()))?;
+ write!(self.writer, "{}ist/{}uit? ", 'l'.bold(), 'q'.bold())?;
self.writer.flush()
}
@@ -116,41 +110,35 @@ impl<'a> WatchState<'a> {
self.writer.execute(Clear(ClearType::All))?;
- if let Some(stdout) = &self.stdout {
- self.writer.write_all(stdout)?;
- self.writer.write_all(b"\n")?;
- }
-
- if let Some(stderr) = &self.stderr {
- self.writer.write_all(stderr)?;
- self.writer.write_all(b"\n")?;
- }
-
+ self.writer.write_all(&self.output)?;
self.writer.write_all(b"\n")?;
if self.show_hint {
- self.writer.write_fmt(format_args!(
- "{}\n{}\n\n",
+ writeln!(
+ self.writer,
+ "{}\n{}\n",
"Hint".bold().cyan().underlined(),
self.app_state.current_exercise().hint,
- ))?;
+ )?;
}
if !matches!(self.done_status, DoneStatus::Pending) {
- self.writer.write_fmt(format_args!(
- "{}\n\n",
+ writeln!(
+ self.writer,
+ "{}\n",
"Exercise done ✓
When you are done experimenting, enter `n` or `next` to go to the next exercise 🦀"
.bold()
.green(),
- ))?;
+ )?;
}
if let DoneStatus::DoneWithSolution(solution_path) = &self.done_status {
- self.writer.write_fmt(format_args!(
- "A solution file can be found at {}\n\n",
+ writeln!(
+ self.writer,
+ "A solution file can be found at {}\n",
style(TerminalFileLink(solution_path)).underlined().green()
- ))?;
+ )?;
}
let line_width = size()?.0;
@@ -159,10 +147,11 @@ When you are done experimenting, enter `n` or `next` to go to the next exercise
self.app_state.exercises().len() as u16,
line_width,
)?;
- self.writer.write_fmt(format_args!(
- "{progress_bar}Current exercise: {}\n",
+ writeln!(
+ self.writer,
+ "{progress_bar}Current exercise: {}",
self.app_state.current_exercise().terminal_link(),
- ))?;
+ )?;
self.show_prompt()?;