1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#[macro_use]
extern crate clap;
extern crate indicatif;
extern crate console;
use clap::{App, SubCommand};
use indicatif::{ProgressBar};
use console::{style, Emoji};
use std::process::Command;
use std::fs::remove_file;
fn main() {
let matches = App::new("r2")
.version(crate_version!())
.author("Olivia Hugger")
.about("Test")
.subcommand(SubCommand::with_name("verify").alias("v"))
.get_matches();
if let Some(_) = matches.subcommand_matches("verify") {
compile_only("exercises/ex1.rs");
compile_only("exercises/ex2.rs");
compile_only("exercises/ex3.rs");
compile_only("exercises/ex4.rs");
compile_only("exercises/ex5.rs");
compile_only("exercises/variables/variables1.rs");
compile_only("exercises/variables/variables2.rs");
compile_only("exercises/variables/variables3.rs");
compile_only("exercises/variables/variables4.rs");
compile_only("exercises/functions/functions1.rs");
compile_only("exercises/functions/functions2.rs");
compile_only("exercises/functions/functions3.rs");
compile_only("exercises/functions/functions4.rs");
compile_only("exercises/functions/functions5.rs");
compile_only("exercises/primitive_types/primitive_types1.rs");
compile_only("exercises/primitive_types/primitive_types2.rs");
compile_only("exercises/primitive_types/primitive_types3.rs");
compile_only("exercises/primitive_types/primitive_types4.rs");
compile_only("exercises/primitive_types/primitive_types5.rs");
compile_only("exercises/primitive_types/primitive_types6.rs");
test("exercises/tests/tests1.rs");
test("exercises/tests/tests2.rs");
test("exercises/tests/tests3.rs");
test("exercises/tests/tests4.rs");
test("exercises/if/if1.rs");
compile_only("exercises/strings/strings1.rs");
compile_only("exercises/strings/strings2.rs");
compile_only("exercises/strings/strings3.rs");
compile_only("exercises/move_semantics/move_semantics1.rs");
compile_only("exercises/move_semantics/move_semantics2.rs");
compile_only("exercises/move_semantics/move_semantics3.rs");
compile_only("exercises/move_semantics/move_semantics4.rs");
compile_only("exercises/modules/modules1.rs");
compile_only("exercises/modules/modules2.rs");
compile_only("exercises/macros/macros1.rs");
compile_only("exercises/macros/macros2.rs");
compile_only("exercises/macros/macros3.rs");
compile_only("exercises/macros/macros4.rs");
test("exercises/error_handling/errors1.rs");
test("exercises/error_handling/errors2.rs");
test("exercises/error_handling/errors3.rs");
test("exercises/error_handling/errorsn.rs");
compile_only("exercises/error_handling/option1.rs");
test("exercises/error_handling/result1.rs");
}
}
fn compile_only(filename: &str) {
let bar = ProgressBar::new_spinner();
bar.set_message(format!("Compiling {}...", filename).as_str());
bar.enable_steady_tick(100);
let compilecmd = Command::new("rustc")
.args(&[filename, "-o", "temp"])
.output()
.expect("fail");
bar.finish_and_clear();
if compilecmd.status.success() {
println!("{} Successfully compiled {}!", Emoji("✅", "✓"), style(filename).italic());
clean().unwrap();
} else {
println!("{} Compilation of {} failed! Compiler error message:\n", Emoji("⚠️ ", "!"), style(filename).italic());
println!("{}", String::from_utf8_lossy(&compilecmd.stderr));
clean().unwrap();
std::process::exit(1);
}
}
fn test(filename: &str) {
let bar = ProgressBar::new_spinner();
bar.set_message(format!("Testing {}...", filename).as_str());
bar.enable_steady_tick(100);
let testcmd = Command::new("rustc")
.args(&["--test", filename, "-o", "temp"])
.output()
.expect("fail");
bar.finish_and_clear();
if testcmd.status.success() {
println!("{} Successfully tested {}!", Emoji("✅", "✓"), style(filename).italic());
clean().unwrap();
} else {
println!("{} Testing of {} failed! Please try again.", Emoji("⚠️ ", "!"), style(filename).italic());
clean().unwrap();
std::process::exit(1);
}
}
fn clean() -> Result<(), std::io::Error> {
remove_file("temp")?;
Ok(())
}
|