summaryrefslogtreecommitdiff
path: root/src/verify.rs
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-11-11 15:59:35 +0000
committerbors <bors@rust-lang.org>2019-11-11 15:59:35 +0000
commit88ec6f6b1645599f77643ee5e6f5dd16cd67c943 (patch)
tree36442292a4e3b0ae07072b0dfaf59a3bc799a397 /src/verify.rs
parenta47a62172a5d4c479d242498b9b140b3111fb7c6 (diff)
parent2cdd61294f0d9a53775ee24ad76435bec8a21e60 (diff)
Auto merge of #230 - jrvidal:master, r=fmoko
Changes the execution mode for `watch`, asking for user input We've [observed](https://hackmd.io/-cK6aPhnTwiCiI7u6k0xug?both) that learners can get confused when they do get everything right, but they _still_ get errors... which come from the next exercise, no the one they just edited. This PR changes it so they have to confirm they want to move forward by removing the `I AM NOT DONE` comment. ![Screenshot at 2019-11-11 15:13:39](https://user-images.githubusercontent.com/1636604/68593566-0abd3900-0496-11ea-9e9d-6c43b91bf21d.png) * [ ] The particular string is of course subject to bikeshed. ### Alternatives/doubts * The coolest solution I could imagine would involve a proc-macro attribute `#![ready(false)]` that they could edit once they're done, but it's a bit complicated to set up. * For now I've put `I AM NOT DONE` everywhere, I think it's what make more sense.
Diffstat (limited to 'src/verify.rs')
-rw-r--r--src/verify.rs56
1 files changed, 50 insertions, 6 deletions
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<Item = &'a Exercise>) -> 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<bool, ()> {
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<bool, ()> {
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<ContextLine>) {
+ 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
+ );
+ }
+}