Optimize embedded dirs

This commit is contained in:
mo8it
2024-05-12 17:40:53 +02:00
parent da9f97b0e0
commit d9df809838
3 changed files with 98 additions and 56 deletions
+18 -4
View File
@@ -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) }),*]
}
}