diff options
| author | mo8it <mo8it@proton.me> | 2024-04-01 02:11:52 +0200 |
|---|---|---|
| committer | mo8it <mo8it@proton.me> | 2024-04-01 02:11:52 +0200 |
| commit | 14f3585816ae12091956efcc45c1e4aefc2f91ce (patch) | |
| tree | 78820c4df79df450a80b572031e6dc561a9d242b /src/bin | |
| parent | 8ad18de54cdad2e94d40d7d4cb67e4a6a274c293 (diff) | |
Make `cargo run` work
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/gen-dev-cargo-toml.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/bin/gen-dev-cargo-toml.rs b/src/bin/gen-dev-cargo-toml.rs new file mode 100644 index 0000000..20167a1 --- /dev/null +++ b/src/bin/gen-dev-cargo-toml.rs @@ -0,0 +1,56 @@ +use anyhow::{bail, Context, Result}; +use serde::Deserialize; +use std::{ + fs::{self, create_dir}, + io::ErrorKind, +}; + +#[derive(Deserialize)] +struct Exercise { + name: String, + path: String, +} + +#[derive(Deserialize)] +struct InfoToml { + exercises: Vec<Exercise>, +} + +fn main() -> Result<()> { + let exercises = toml_edit::de::from_str::<InfoToml>( + &fs::read_to_string("info.toml").context("Failed to read `info.toml`")?, + ) + .context("Failed to deserialize `info.toml`")? + .exercises; + + let mut buf = Vec::with_capacity(1 << 14); + + buf.extend_from_slice(b"bin = [\n"); + + for exercise in exercises { + buf.extend_from_slice(b" { name = \""); + buf.extend_from_slice(exercise.name.as_bytes()); + buf.extend_from_slice(b"\", path = \"../"); + buf.extend_from_slice(exercise.path.as_bytes()); + buf.extend_from_slice(b"\" },\n"); + } + + buf.extend_from_slice( + br#"] + +[package] +name = "rustlings" +version = "0.0.0" +edition = "2021" +publish = false +"#, + ); + + if let Err(e) = create_dir("dev") { + if e.kind() != ErrorKind::AlreadyExists { + bail!("Failed to create the `dev` directory: {e}"); + } + } + + fs::write("dev/Cargo.toml", buf).context("Failed to write `dev/Cargo.toml`") +} |
