diff options
Diffstat (limited to 'src/verify.rs')
| -rw-r--r-- | src/verify.rs | 75 |
1 files changed, 30 insertions, 45 deletions
diff --git a/src/verify.rs b/src/verify.rs index afe0884..c4451b2 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,86 +1,71 @@ -use crate::util; +use crate::exercise::{Exercise, Mode}; use console::{style, Emoji}; use indicatif::ProgressBar; -use std::fs; -use toml::Value; -pub fn verify(start_at: Option<&str>) -> Result<(), ()> { - let toml: Value = fs::read_to_string("info.toml").unwrap().parse().unwrap(); - let tomlvec: &Vec<Value> = toml.get("exercises").unwrap().as_array().unwrap(); - let mut hit_start_at = false; - - for i in tomlvec { - let path = i.get("path").unwrap().as_str().unwrap(); - - if let Some(start_at) = start_at { - if start_at.ends_with(path) { - hit_start_at = true; - } else if !hit_start_at { - continue; - } - } - - match i.get("mode").unwrap().as_str().unwrap() { - "test" => test(path)?, - "compile" => compile_only(path)?, - _ => (), +pub fn verify<'a>(start_at: impl IntoIterator<Item=&'a Exercise>) -> Result<(), ()> { + for exercise in start_at { + match exercise.mode { + Mode::Test => test(&exercise)?, + Mode::Compile => compile_only(&exercise)?, } } Ok(()) } -fn compile_only(filename: &str) -> Result<(), ()> { +fn compile_only(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Compiling {}...", filename).as_str()); + progress_bar.set_message(format!("Compiling {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let compilecmd = util::compile_cmd(filename); + let compile_output = exercise.compile(); progress_bar.finish_and_clear(); - if compilecmd.status.success() { + if compile_output.status.success() { let formatstr = format!( "{} Successfully compiled {}!", Emoji("✅", "✓"), - filename + exercise ); println!("{}", style(formatstr).green()); - util::clean(); + exercise.clean(); Ok(()) } else { let formatstr = format!( "{} Compilation of {} failed! Compiler error message:\n", Emoji("⚠️ ", "!"), - filename + exercise ); println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&compilecmd.stderr)); - util::clean(); + println!("{}", String::from_utf8_lossy(&compile_output.stderr)); + exercise.clean(); Err(()) } } -pub fn test(filename: &str) -> Result<(), ()> { +pub fn test(exercise: &Exercise) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); - progress_bar.set_message(format!("Testing {}...", filename).as_str()); + progress_bar.set_message(format!("Testing {}...", exercise).as_str()); progress_bar.enable_steady_tick(100); - let testcmd = util::compile_test_cmd(filename); - if testcmd.status.success() { - progress_bar.set_message(format!("Running {}...", filename).as_str()); - let runcmd = util::run_cmd(); + + let compile_output = exercise.compile(); + if compile_output.status.success() { + progress_bar.set_message(format!("Running {}...", exercise).as_str()); + + let runcmd = exercise.run(); progress_bar.finish_and_clear(); if runcmd.status.success() { - let formatstr = format!("{} Successfully tested {}!", Emoji("✅", "✓"), filename); + let formatstr = format!("{} Successfully tested {}!", Emoji("✅", "✓"), exercise); println!("{}", style(formatstr).green()); - util::clean(); + exercise.clean(); Ok(()) } else { let formatstr = format!( "{} Testing of {} failed! Please try again. Here's the output:", Emoji("⚠️ ", "!"), - filename + exercise ); println!("{}", style(formatstr).red()); println!("{}", String::from_utf8_lossy(&runcmd.stdout)); - util::clean(); + exercise.clean(); Err(()) } } else { @@ -88,11 +73,11 @@ pub fn test(filename: &str) -> Result<(), ()> { let formatstr = format!( "{} Compiling of {} failed! Please try again. Here's the output:", Emoji("⚠️ ", "!"), - filename + exercise ); println!("{}", style(formatstr).red()); - println!("{}", String::from_utf8_lossy(&testcmd.stderr)); - util::clean(); + println!("{}", String::from_utf8_lossy(&compile_output.stderr)); + exercise.clean(); Err(()) } } |
