summaryrefslogtreecommitdiff
path: root/src/verify.rs
diff options
context:
space:
mode:
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
+ );
+ }
+}