diff --git a/src/exercise.rs b/src/exercise.rs index 664b362b..aea9a715 100644 --- a/src/exercise.rs +++ b/src/exercise.rs @@ -54,6 +54,8 @@ pub struct Exercise { pub mode: Mode, // The hint text associated with the exercise pub hint: String, + // The path of the next exercise + pub next_path: Option, } // An enum to track of the state of an Exercise. @@ -287,6 +289,7 @@ mod test { path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), mode: Mode::Compile, hint: String::from(""), + next_path: None, }; let compiled = exercise.compile().unwrap(); drop(compiled); @@ -305,6 +308,7 @@ mod test { path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), mode: *mode, hint: String::from(""), + next_path: None, }; let _ = exercise.compile().unwrap(); assert!(!Path::new(&format!("{}.pdb", temp_file())).exists()); @@ -318,6 +322,7 @@ mod test { path: PathBuf::from("tests/fixture/state/pending_exercise.rs"), mode: Mode::Compile, hint: String::new(), + next_path: None, }; let state = exercise.state(); @@ -359,6 +364,7 @@ mod test { path: PathBuf::from("tests/fixture/state/finished_exercise.rs"), mode: Mode::Compile, hint: String::new(), + next_path: None, }; assert_eq!(exercise.state(), State::Done); @@ -371,6 +377,7 @@ mod test { path: PathBuf::from("tests/fixture/success/testSuccess.rs"), mode: Mode::Test, hint: String::new(), + next_path: None, }; let out = exercise.compile().unwrap().run().unwrap(); assert!(out.stdout.contains("THIS TEST TOO SHALL PASS")); diff --git a/src/main.rs b/src/main.rs index a06f0c56..e31488d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use notify_debouncer_mini::{new_debouncer, DebouncedEventKind}; use std::ffi::OsStr; use std::fs; use std::io::{self, prelude::*}; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::{channel, RecvTimeoutError}; @@ -108,9 +108,11 @@ fn main() { } let toml_str = &fs::read_to_string("info.toml").unwrap(); - let exercises = toml::from_str::(toml_str).unwrap().exercises; + let mut exercises = toml::from_str::(toml_str).unwrap().exercises; let verbose = args.nocapture; + edit_exercises(&mut exercises); + let command = args.command.unwrap_or_else(|| { println!("{DEFAULT_OUT}\n"); std::process::exit(0); @@ -245,6 +247,20 @@ fn main() { } } +fn edit_exercises(exercises: &mut Vec) { + let siz = exercises.len(); + for i in 0..siz { + if i == siz - 1 { + exercises[i].next_path = None; + break; + } + let next_path = &exercises[i + 1].path; + let mut x = PathBuf::new(); + x.push(next_path); + exercises[i].next_path = Some(x); + } +} + fn spawn_watch_shell( failed_exercise_hint: &Arc>>, should_quit: Arc, diff --git a/src/verify.rs b/src/verify.rs index aee2afa3..c4ac0549 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -180,6 +180,13 @@ fn prompt_for_completion( let no_emoji = env::var("NO_EMOJI").is_ok(); + match &exercise.next_path { + Some(path) => { + println!("Next up: {:?}", path); + } + None => {} + } + let clippy_success_msg = if no_emoji { "The code is compiling, and Clippy is happy!" } else {