mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-01-07 03:09:19 +00:00
80 lines
1.8 KiB
Rust
80 lines
1.8 KiB
Rust
use glob::glob;
|
|
use serde::Serialize;
|
|
use std::path::Path;
|
|
use toml;
|
|
|
|
pub fn generate(root: &Path) -> String {
|
|
let mut bins = vec![];
|
|
|
|
let root_glob = {
|
|
let mut p = root.to_owned();
|
|
p.push("**");
|
|
p.push("*.rs");
|
|
p
|
|
};
|
|
|
|
let mut exercise_paths: Vec<_> = glob(root_glob.to_str().unwrap())
|
|
.unwrap()
|
|
.collect::<Result<_, _>>()
|
|
.expect("Error traversing root");
|
|
|
|
exercise_paths.sort();
|
|
|
|
for path in &exercise_paths {
|
|
let name = path
|
|
.file_stem()
|
|
.expect("Malformed exercise path")
|
|
.to_str()
|
|
.expect("Invalid UTF8 in exercise path")
|
|
.to_string();
|
|
|
|
let target_path = path.strip_prefix(root).unwrap();
|
|
|
|
bins.push(Bin {
|
|
name,
|
|
path: target_path.to_str().unwrap().to_string(),
|
|
});
|
|
}
|
|
|
|
let manifest = Manifest {
|
|
package: Package {
|
|
name: "exercises",
|
|
version: "0.1.0",
|
|
authors: &["The Rustlings Maintainers"],
|
|
edition: "2018",
|
|
publish: false,
|
|
},
|
|
bin: bins,
|
|
};
|
|
|
|
format!(
|
|
"# This Cargo.toml is AUTOGENERATED, you shouldn't need to edit it.\n\
|
|
# The `rustling` commands do not rely on this manifest at all, its only purpose\n\
|
|
# is to help editors analyze your code.\n\
|
|
# To regenerate it, run `cargo generate-manifest`.\n\
|
|
{}",
|
|
toml::ser::to_string_pretty(&manifest).expect("Invalid toml")
|
|
)
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct Manifest {
|
|
package: Package,
|
|
bin: Vec<Bin>,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct Package {
|
|
name: &'static str,
|
|
version: &'static str,
|
|
edition: &'static str,
|
|
authors: &'static [&'static str],
|
|
publish: bool,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
struct Bin {
|
|
name: String,
|
|
path: String,
|
|
}
|