summaryrefslogtreecommitdiff
path: root/rustlings-macros/src
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-05-12 17:40:53 +0200
committermo8it <mo8it@proton.me>2024-05-12 17:40:53 +0200
commitd9df809838191962a82e98ff01aaaa73950ba670 (patch)
treeb1449c17c75608e942c6fb57bbe071fa5d8a4494 /rustlings-macros/src
parentda9f97b0e0a54747202c43c6aed8346cc784cb02 (diff)
Optimize embedded dirs
Diffstat (limited to 'rustlings-macros/src')
-rw-r--r--rustlings-macros/src/lib.rs22
1 files changed, 18 insertions, 4 deletions
diff --git a/rustlings-macros/src/lib.rs b/rustlings-macros/src/lib.rs
index fc2bcf1..4417a4f 100644
--- a/rustlings-macros/src/lib.rs
+++ b/rustlings-macros/src/lib.rs
@@ -25,14 +25,28 @@ pub fn include_files(_: TokenStream) -> TokenStream {
let solution_files = exercises
.iter()
.map(|exercise| format!("../solutions/{}/{}.rs", exercise.dir, exercise.name));
- let dirs = exercises.iter().map(|exercise| &exercise.dir);
- let readmes = exercises
+
+ let mut dirs = Vec::with_capacity(32);
+ let mut dir_inds = vec![0; exercises.len()];
+
+ for (exercise, dir_ind) in exercises.iter().zip(&mut dir_inds) {
+ // The directory is often the last one inserted.
+ if let Some(ind) = dirs.iter().rev().position(|dir| *dir == exercise.dir) {
+ *dir_ind = dirs.len() - 1 - ind;
+ continue;
+ }
+
+ dirs.push(exercise.dir.as_str());
+ *dir_ind = dirs.len() - 1;
+ }
+
+ let readmes = dirs
.iter()
- .map(|exercise| format!("../exercises/{}/README.md", exercise.dir));
+ .map(|dir| format!("../exercises/{dir}/README.md"));
quote! {
EmbeddedFiles {
- exercise_files: &[#(ExerciseFiles { exercise: include_bytes!(#exercise_files), solution: include_bytes!(#solution_files) }),*],
+ exercise_files: &[#(ExerciseFiles { exercise: include_bytes!(#exercise_files), solution: include_bytes!(#solution_files), dir_ind: #dir_inds }),*],
exercise_dirs: &[#(ExerciseDir { name: #dirs, readme: include_bytes!(#readmes) }),*]
}
}