From 2cdd61294f0d9a53775ee24ad76435bec8a21e60 Mon Sep 17 00:00:00 2001 From: Roberto Vidal Date: Mon, 11 Nov 2019 13:38:24 +0100 Subject: feat: improve `watch` execution mode The `watch` command now requires user action to move to the next exercise. BREAKING CHANGE: this changes the behavior of `watch`. --- src/verify.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) (limited to 'src/verify.rs') diff --git a/src/verify.rs b/src/verify.rs index d066afa..020102e 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,18 +1,21 @@ -use crate::exercise::{Exercise, Mode}; +use crate::exercise::{ContextLine, Exercise, Mode, State}; use console::{style, Emoji}; use indicatif::ProgressBar; pub fn verify<'a>(start_at: impl IntoIterator) -> Result<(), ()> { for exercise in start_at { - match exercise.mode { + let is_done = match exercise.mode { Mode::Test => test(&exercise)?, Mode::Compile => compile_only(&exercise)?, + }; + if !is_done { + return Err(()); } } Ok(()) } -fn compile_only(exercise: &Exercise) -> Result<(), ()> { +fn compile_only(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); @@ -22,7 +25,12 @@ fn compile_only(exercise: &Exercise) -> Result<(), ()> { let formatstr = format!("{} Successfully compiled {}!", Emoji("✅", "✓"), exercise); println!("{}", style(formatstr).green()); exercise.clean(); - Ok(()) + if let State::Pending(context) = exercise.state() { + print_everything_looks_good(exercise.mode, context); + Ok(false) + } else { + Ok(true) + } } else { let formatstr = format!( "{} Compilation of {} failed! Compiler error message:\n", @@ -36,7 +44,7 @@ fn compile_only(exercise: &Exercise) -> Result<(), ()> { } } -pub fn test(exercise: &Exercise) -> Result<(), ()> { +pub fn test(exercise: &Exercise) -> Result { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); @@ -52,7 +60,12 @@ pub fn test(exercise: &Exercise) -> Result<(), ()> { let formatstr = format!("{} Successfully tested {}!", Emoji("✅", "✓"), exercise); println!("{}", style(formatstr).green()); exercise.clean(); - Ok(()) + if let State::Pending(context) = exercise.state() { + print_everything_looks_good(exercise.mode, context); + Ok(false) + } else { + Ok(true) + } } else { let formatstr = format!( "{} Testing of {} failed! Please try again. Here's the output:", @@ -77,3 +90,34 @@ pub fn test(exercise: &Exercise) -> Result<(), ()> { Err(()) } } + +fn print_everything_looks_good(mode: Mode, context: Vec) { + let success_msg = match mode { + Mode::Compile => "The code is compiling!", + Mode::Test => "The code is compiling, and the tests pass!", + }; + + println!(""); + println!("🎉 🎉 {} 🎉 🎉", success_msg); + println!(""); + println!("You can keep working on this exercise,"); + println!( + "or jump into the next one by removing the {} comment:", + style("`I AM NOT DONE`").bold() + ); + println!(""); + for context_line in context { + let formatted_line = if context_line.important { + format!("{}", style(context_line.line).bold()) + } else { + format!("{}", context_line.line) + }; + + println!( + "{:>2} {} {}", + style(context_line.number).blue().bold(), + style("|").blue(), + formatted_line + ); + } +} -- cgit v1.2.3