@@ -2,54 +2,71 @@ use crate::util::clean;
22use crate :: verify:: test;
33use console:: { style, Emoji } ;
44use indicatif:: ProgressBar ;
5+ use std:: fs;
56use std:: process:: Command ;
7+ use toml:: Value ;
68
7- pub fn run ( matches : clap:: ArgMatches ) {
9+ pub fn run ( matches : clap:: ArgMatches ) -> Result < ( ) , ( ) > {
810 if let Some ( filename) = matches. value_of ( "file" ) {
9- if matches. is_present ( "test" ) {
10- match test ( filename) {
11- Ok ( _) => ( ) ,
12- Err ( _) => ( ) ,
13- }
14- std:: process:: exit ( 0 ) ;
11+ let toml: Value = fs:: read_to_string ( "info.toml" ) . unwrap ( ) . parse ( ) . unwrap ( ) ;
12+ let tomlvec: & Vec < Value > = toml. get ( "exercises" ) . unwrap ( ) . as_array ( ) . unwrap ( ) ;
13+ let mut exercises = tomlvec. clone ( ) ;
14+ exercises. retain ( |i| i. get ( "path" ) . unwrap ( ) . as_str ( ) . unwrap ( ) == filename) ;
15+ if exercises. is_empty ( ) {
16+ println ! ( "No exercise found for your filename!" ) ;
17+ std:: process:: exit ( 1 ) ;
1518 }
16- let bar = ProgressBar :: new_spinner ( ) ;
17- bar. set_message ( format ! ( "Compiling {}..." , filename) . as_str ( ) ) ;
18- bar. enable_steady_tick ( 100 ) ;
19- let compilecmd = Command :: new ( "rustc" )
20- . args ( & [ filename, "-o" , "temp" , "--color" , "always" ] )
21- . output ( )
22- . expect ( "fail" ) ;
23- bar. set_message ( format ! ( "Running {}..." , filename) . as_str ( ) ) ;
24- if compilecmd. status . success ( ) {
25- let runcmd = Command :: new ( "./temp" ) . output ( ) . expect ( "fail" ) ;
26- bar. finish_and_clear ( ) ;
2719
28- if runcmd. status . success ( ) {
29- println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stdout) ) ;
30- let formatstr = format ! ( "{} Successfully ran {}" , Emoji ( "✅" , "✓" ) , filename) ;
31- println ! ( "{}" , style( formatstr) . green( ) ) ;
32- clean ( ) ;
33- } else {
34- println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stdout) ) ;
35- println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stderr) ) ;
20+ let exercise: & Value = & exercises[ 0 ] ;
21+ match exercise. get ( "mode" ) . unwrap ( ) . as_str ( ) . unwrap ( ) {
22+ "test" => test ( exercise. get ( "path" ) . unwrap ( ) . as_str ( ) . unwrap ( ) ) ?,
23+ "compile" => compile_and_run ( exercise. get ( "path" ) . unwrap ( ) . as_str ( ) . unwrap ( ) ) ?,
24+ _ => ( ) ,
25+ }
26+ Ok ( ( ) )
27+ } else {
28+ panic ! ( "Please supply a filename!" ) ;
29+ }
30+ }
3631
37- let formatstr = format ! ( "{} Ran {} with errors" , Emoji ( "⚠️ " , "!" ) , filename) ;
38- println ! ( "{}" , style( formatstr) . red( ) ) ;
39- clean ( ) ;
40- }
32+ pub fn compile_and_run ( filename : & str ) -> Result < ( ) , ( ) > {
33+ let bar = ProgressBar :: new_spinner ( ) ;
34+ bar. set_message ( format ! ( "Compiling {}..." , filename) . as_str ( ) ) ;
35+ bar. enable_steady_tick ( 100 ) ;
36+ let compilecmd = Command :: new ( "rustc" )
37+ . args ( & [ filename, "-o" , "temp" , "--color" , "always" ] )
38+ . output ( )
39+ . expect ( "fail" ) ;
40+ bar. set_message ( format ! ( "Running {}..." , filename) . as_str ( ) ) ;
41+ if compilecmd. status . success ( ) {
42+ let runcmd = Command :: new ( "./temp" ) . output ( ) . expect ( "fail" ) ;
43+ bar. finish_and_clear ( ) ;
44+
45+ if runcmd. status . success ( ) {
46+ println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stdout) ) ;
47+ let formatstr = format ! ( "{} Successfully ran {}" , Emoji ( "✅" , "✓" ) , filename) ;
48+ println ! ( "{}" , style( formatstr) . green( ) ) ;
49+ clean ( ) ;
50+ Ok ( ( ) )
4151 } else {
42- bar. finish_and_clear ( ) ;
43- let formatstr = format ! (
44- "{} Compilation of {} failed! Compiler error message:\n " ,
45- Emoji ( "⚠️ " , "!" ) ,
46- filename
47- ) ;
52+ println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stdout) ) ;
53+ println ! ( "{}" , String :: from_utf8_lossy( & runcmd. stderr) ) ;
54+
55+ let formatstr = format ! ( "{} Ran {} with errors" , Emoji ( "⚠️ " , "!" ) , filename) ;
4856 println ! ( "{}" , style( formatstr) . red( ) ) ;
49- println ! ( "{}" , String :: from_utf8_lossy( & compilecmd. stderr) ) ;
5057 clean ( ) ;
58+ Err ( ( ) )
5159 }
5260 } else {
53- panic ! ( "Please supply a filename!" ) ;
61+ bar. finish_and_clear ( ) ;
62+ let formatstr = format ! (
63+ "{} Compilation of {} failed! Compiler error message:\n " ,
64+ Emoji ( "⚠️ " , "!" ) ,
65+ filename
66+ ) ;
67+ println ! ( "{}" , style( formatstr) . red( ) ) ;
68+ println ! ( "{}" , String :: from_utf8_lossy( & compilecmd. stderr) ) ;
69+ clean ( ) ;
70+ Err ( ( ) )
5471 }
5572}
0 commit comments