diff options
| author | mo8it <mo8it@proton.me> | 2024-05-12 17:40:53 +0200 |
|---|---|---|
| committer | mo8it <mo8it@proton.me> | 2024-05-12 17:40:53 +0200 |
| commit | d9df809838191962a82e98ff01aaaa73950ba670 (patch) | |
| tree | b1449c17c75608e942c6fb57bbe071fa5d8a4494 /rustlings-macros/src/lib.rs | |
| parent | da9f97b0e0a54747202c43c6aed8346cc784cb02 (diff) | |
Optimize embedded dirs
Diffstat (limited to 'rustlings-macros/src/lib.rs')
| -rw-r--r-- | rustlings-macros/src/lib.rs | 22 |
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) }),*] } } |
