Skip to content

Commit 627cdc0

Browse files
author
marisa
committed
feat: Index exercises by name
BREAKING CHANGE: This changes the way you use `rustlings run` by now requiring an abridged form of the previous filename, e.g: `rustlings run exercises/if/if1.rs` becomes `rustlings run if1`
1 parent a47a621 commit 627cdc0

File tree

6 files changed

+68
-15
lines changed

6 files changed

+68
-15
lines changed

info.toml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,241 +1,292 @@
11
# VARIABLES
22

33
[[exercises]]
4+
name = "variables1"
45
path = "exercises/variables/variables1.rs"
56
mode = "compile"
67

78
[[exercises]]
9+
name = "variables2"
810
path = "exercises/variables/variables2.rs"
911
mode = "compile"
1012

1113
[[exercises]]
14+
name = "variables3"
1215
path = "exercises/variables/variables3.rs"
1316
mode = "compile"
1417

1518
[[exercises]]
19+
name = "variables4"
1620
path = "exercises/variables/variables4.rs"
1721
mode = "compile"
1822

1923
# IF
2024

2125
[[exercises]]
26+
name = "if1"
2227
path = "exercises/if/if1.rs"
2328
mode = "test"
2429

2530
# FUNCTIONS
2631

2732
[[exercises]]
33+
name = "functions1"
2834
path = "exercises/functions/functions1.rs"
2935
mode = "compile"
3036

3137
[[exercises]]
38+
name = "functions2"
3239
path = "exercises/functions/functions2.rs"
3340
mode = "compile"
3441

3542
[[exercises]]
43+
name = "functions3"
3644
path = "exercises/functions/functions3.rs"
3745
mode = "compile"
3846

3947
[[exercises]]
48+
name = "functions4"
4049
path = "exercises/functions/functions4.rs"
4150
mode = "compile"
4251

4352
[[exercises]]
53+
name = "functions5"
4454
path = "exercises/functions/functions5.rs"
4555
mode = "compile"
4656

4757
# TEST 1
4858

4959
[[exercises]]
60+
name = "test1"
5061
path = "exercises/test1.rs"
5162
mode = "test"
5263

5364
# PRIMITIVE TYPES
5465

5566
[[exercises]]
67+
name = "primitive_types1"
5668
path = "exercises/primitive_types/primitive_types1.rs"
5769
mode = "compile"
5870

5971
[[exercises]]
72+
name = "primitive_types2"
6073
path = "exercises/primitive_types/primitive_types2.rs"
6174
mode = "compile"
6275

6376
[[exercises]]
77+
name = "primitive_types3"
6478
path = "exercises/primitive_types/primitive_types3.rs"
6579
mode = "compile"
6680

6781
[[exercises]]
82+
name = "primitive_types4"
6883
path = "exercises/primitive_types/primitive_types4.rs"
6984
mode = "test"
7085

7186
[[exercises]]
87+
name = "primitive_types5"
7288
path = "exercises/primitive_types/primitive_types5.rs"
7389
mode = "compile"
7490

7591
[[exercises]]
92+
name = "primitive_types6"
7693
path = "exercises/primitive_types/primitive_types6.rs"
7794
mode = "compile"
7895

7996
# STRUCTS
8097

8198
[[exercises]]
99+
name = "structs1"
82100
path = "exercises/structs/structs1.rs"
83101
mode = "test"
84102

85103
[[exercises]]
104+
name = "structs2"
86105
path = "exercises/structs/structs2.rs"
87106
mode = "test"
88107

89108
# STRINGS
90109

91110
[[exercises]]
111+
name = "strings1"
92112
path = "exercises/strings/strings1.rs"
93113
mode = "compile"
94114

95115
[[exercises]]
116+
name = "strings2"
96117
path = "exercises/strings/strings2.rs"
97118
mode = "compile"
98119

99120
# TEST 2
100121

101122
[[exercises]]
123+
name = "test2"
102124
path = "exercises/test2.rs"
103125
mode = "compile"
104126

105127
# ENUMS
106128

107129
[[exercises]]
130+
name = "enums1"
108131
path = "exercises/enums/enums1.rs"
109132
mode = "compile"
110133

111134
[[exercises]]
135+
name = "enums2"
112136
path = "exercises/enums/enums2.rs"
113137
mode = "compile"
114138

115139
[[exercises]]
140+
name = "enums3"
116141
path = "exercises/enums/enums3.rs"
117142
mode = "test"
118143

119144
# TESTS
120145

121146
[[exercises]]
147+
name = "tests1"
122148
path = "exercises/tests/tests1.rs"
123149
mode = "test"
124150

125151
[[exercises]]
152+
name = "tests2"
126153
path = "exercises/tests/tests2.rs"
127154
mode = "test"
128155

129156
[[exercises]]
157+
name = "tests3"
130158
path = "exercises/tests/tests3.rs"
131159
mode = "test"
132160

133161
# TEST 3
134162

135163
[[exercises]]
164+
name = "test3"
136165
path = "exercises/test3.rs"
137166
mode = "test"
138167

139168
# MODULES
140169

141170
[[exercises]]
171+
name = "modules1"
142172
path = "exercises/modules/modules1.rs"
143173
mode = "compile"
144174

145175
[[exercises]]
176+
name = "modules2"
146177
path = "exercises/modules/modules2.rs"
147178
mode = "compile"
148179

149180
# MACROS
150181

151182
[[exercises]]
183+
name = "macros1"
152184
path = "exercises/macros/macros1.rs"
153185
mode = "compile"
154186

155187
[[exercises]]
188+
name = "macros2"
156189
path = "exercises/macros/macros2.rs"
157190
mode = "compile"
158191

159192
[[exercises]]
193+
name = "macros3"
160194
path = "exercises/macros/macros3.rs"
161195
mode = "compile"
162196

163197
[[exercises]]
198+
name = "macros4"
164199
path = "exercises/macros/macros4.rs"
165200
mode = "compile"
166201

167202
# TEST 4
168203

169204
[[exercises]]
205+
name = "test4"
170206
path = "exercises/test4.rs"
171207
mode = "compile"
172208

173209
# MOVE SEMANTICS
174210

175211
[[exercises]]
212+
name = "move_semantics1"
176213
path = "exercises/move_semantics/move_semantics1.rs"
177214
mode = "compile"
178215

179216
[[exercises]]
217+
name = "move_semantics2"
180218
path = "exercises/move_semantics/move_semantics2.rs"
181219
mode = "compile"
182220

183221
[[exercises]]
222+
name = "move_semantics3"
184223
path = "exercises/move_semantics/move_semantics3.rs"
185224
mode = "compile"
186225

187226
[[exercises]]
227+
name = "move_semantics4"
188228
path = "exercises/move_semantics/move_semantics4.rs"
189229
mode = "compile"
190230

191231
# ERROR HANDLING
192232

193233
[[exercises]]
234+
name = "errors1"
194235
path = "exercises/error_handling/errors1.rs"
195236
mode = "test"
196237

197238
[[exercises]]
239+
name = "errors2"
198240
path = "exercises/error_handling/errors2.rs"
199241
mode = "test"
200242

201243
[[exercises]]
244+
name = "errors3"
202245
path = "exercises/error_handling/errors3.rs"
203246
mode = "test"
204247

205248
[[exercises]]
249+
name = "errors4"
206250
path = "exercises/error_handling/errorsn.rs"
207251
mode = "test"
208252

209253
# OPTIONS / RESULTS
210254

211255
[[exercises]]
256+
name = "option1"
212257
path = "exercises/error_handling/option1.rs"
213258
mode = "test"
214259

215260
[[exercises]]
261+
name = "option2"
216262
path = "exercises/error_handling/result1.rs"
217263
mode = "test"
218264

219265
# STANDARD LIBRARY TYPES
220266

221267
[[exercises]]
268+
name = "arc1"
222269
path = "exercises/standard_library_types/arc1.rs"
223270
mode = "compile"
224271

225272
[[exercises]]
273+
name = "iterators2"
226274
path = "exercises/standard_library_types/iterators2.rs"
227275
mode = "test"
228276

229277
[[exercises]]
278+
name = "iterators3"
230279
path = "exercises/standard_library_types/iterators3.rs"
231280
mode = "test"
232281

233282
[[exercises]]
283+
name = "iterators4"
234284
path = "exercises/standard_library_types/iterators4.rs"
235285
mode = "test"
236286

237287
# THREADS
238288

239289
[[exercises]]
290+
name = "threads1"
240291
path = "exercises/threads/threads1.rs"
241292
mode = "compile"

src/exercise.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub struct ExerciseList {
2424

2525
#[derive(Deserialize)]
2626
pub struct Exercise {
27+
pub name: String,
2728
pub path: PathBuf,
2829
pub mode: Mode,
2930
}
@@ -70,6 +71,7 @@ mod test {
7071
fn test_clean() {
7172
File::create(&temp_file()).unwrap();
7273
let exercise = Exercise {
74+
name: String::from("example"),
7375
path: PathBuf::from("example.rs"),
7476
mode: Mode::Test,
7577
};

src/main.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ fn main() {
2525
SubCommand::with_name("run")
2626
.alias("r")
2727
.about("Runs/Tests a single exercise")
28-
.arg(Arg::with_name("file").required(true).index(1))
29-
.arg(Arg::with_name("test").short("t").long("test").help("Run the file as a test")),
28+
.arg(Arg::with_name("name").required(true).index(1)),
3029
)
3130
.get_matches();
3231

@@ -55,20 +54,17 @@ fn main() {
5554
let exercises = toml::from_str::<ExerciseList>(toml_str).unwrap().exercises;
5655

5756
if let Some(ref matches) = matches.subcommand_matches("run") {
58-
let filename = matches.value_of("file").unwrap_or_else(|| {
59-
println!("Please supply a file name!");
57+
let name = matches.value_of("name").unwrap_or_else(|| {
58+
println!("Please supply an exercise name!");
6059
std::process::exit(1);
6160
});
6261

6362
let matching_exercise = |e: &&Exercise| {
64-
Path::new(filename)
65-
.canonicalize()
66-
.map(|p| p.ends_with(&e.path))
67-
.unwrap_or(false)
63+
name == e.name
6864
};
6965

7066
let exercise = exercises.iter().find(matching_exercise).unwrap_or_else(|| {
71-
println!("No exercise found for your file name!");
67+
println!("No exercise found for your given name!");
7268
std::process::exit(1)
7369
});
7470

tests/fixture/failure/info.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
[[exercises]]
2+
name = "compFailure"
23
path = "compFailure.rs"
34
mode = "compile"
45

56
[[exercises]]
7+
name = "testFailure"
68
path = "testFailure.rs"
7-
mode = "test"
9+
mode = "test"

tests/fixture/success/info.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
[[exercises]]
2+
name = "compSuccess"
23
path = "compSuccess.rs"
34
mode = "compile"
45

56
[[exercises]]
7+
name = "testSuccess"
68
path = "testSuccess.rs"
7-
mode = "test"
9+
mode = "test"

0 commit comments

Comments
 (0)