Merge remote-tracking branch 'upstream/main' into fix-enum-variant-inconsistency

This commit is contained in:
mo8it
2024-07-05 13:39:50 +02:00
269 changed files with 9826 additions and 7926 deletions
+20
View File
@@ -0,0 +1,20 @@
[package]
name = "rustlings-macros"
description = "A macros crate intended to be used only by Rustlings"
version.workspace = true
authors.workspace = true
repository.workspace = true
license.workspace = true
edition.workspace = true
include = [
"/src/",
"/info.toml",
]
[lib]
proc-macro = true
[dependencies]
quote = "1.0.36"
serde.workspace = true
toml_edit.workspace = true
File diff suppressed because it is too large Load Diff
+56
View File
@@ -0,0 +1,56 @@
use proc_macro::TokenStream;
use quote::quote;
use serde::Deserialize;
#[derive(Deserialize)]
struct ExerciseInfo {
name: String,
dir: String,
}
#[derive(Deserialize)]
struct InfoFile {
exercises: Vec<ExerciseInfo>,
}
#[proc_macro]
pub fn include_files(_: TokenStream) -> TokenStream {
let info_file = include_str!("../info.toml");
let exercises = toml_edit::de::from_str::<InfoFile>(info_file)
.expect("Failed to parse `info.toml`")
.exercises;
let exercise_files = exercises
.iter()
.map(|exercise| format!("../exercises/{}/{}.rs", exercise.dir, exercise.name));
let solution_files = exercises
.iter()
.map(|exercise| format!("../solutions/{}/{}.rs", exercise.dir, exercise.name));
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(|dir| format!("../exercises/{dir}/README.md"));
quote! {
EmbeddedFiles {
info_file: #info_file,
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) }),*]
}
}
.into()
}