@@ -2,54 +2,71 @@ use crate::util::clean;
2
2
use crate :: verify:: test;
3
3
use console:: { style, Emoji } ;
4
4
use indicatif:: ProgressBar ;
5
+ use std:: fs;
5
6
use std:: process:: Command ;
7
+ use toml:: Value ;
6
8
7
- pub fn run ( matches : clap:: ArgMatches ) {
9
+ pub fn run ( matches : clap:: ArgMatches ) -> Result < ( ) , ( ) > {
8
10
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 ) ;
15
18
}
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 ( ) ;
27
19
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
+ }
36
31
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 ( ( ) )
41
51
} 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) ;
48
56
println ! ( "{}" , style( formatstr) . red( ) ) ;
49
- println ! ( "{}" , String :: from_utf8_lossy( & compilecmd. stderr) ) ;
50
57
clean ( ) ;
58
+ Err ( ( ) )
51
59
}
52
60
} 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 ( ( ) )
54
71
}
55
72
}
0 commit comments