summaryrefslogtreecommitdiff
path: root/src/init.rs
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-03-29 01:29:41 +0100
committermo8it <mo8it@proton.me>2024-03-29 01:29:41 +0100
commit36a8e3ac0ee4f59ed587725e3257a79129a981e2 (patch)
tree91f58316f2bb87b908d90bbe6754f9bf1b0426f2 /src/init.rs
parent0f18d599e92189d5f3ba085dcb4c8c4da9c7f584 (diff)
Replace rust-project.json with Cargo.toml
Diffstat (limited to 'src/init.rs')
-rw-r--r--src/init.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/init.rs b/src/init.rs
new file mode 100644
index 0000000..6653535
--- /dev/null
+++ b/src/init.rs
@@ -0,0 +1,75 @@
+use anyhow::{bail, Context, Result};
+use std::{
+ env::set_current_dir,
+ fs::{create_dir, OpenOptions},
+ io::{self, ErrorKind, Write},
+ path::Path,
+};
+
+use crate::{embedded::EMBEDDED_FILES, exercise::Exercise};
+
+fn create_cargo_toml(exercises: &[Exercise]) -> io::Result<()> {
+ let mut cargo_toml = Vec::with_capacity(1 << 13);
+ cargo_toml.extend_from_slice(
+ br#"[package]
+name = "rustlings"
+version = "0.0.0"
+edition = "2021"
+publish = false
+"#,
+ );
+ for exercise in exercises {
+ cargo_toml.extend_from_slice(b"\n[[bin]]\nname = \"");
+ cargo_toml.extend_from_slice(exercise.name.as_bytes());
+ cargo_toml.extend_from_slice(b"\"\npath = \"");
+ cargo_toml.extend_from_slice(exercise.path.to_str().unwrap().as_bytes());
+ cargo_toml.extend_from_slice(b"\"\n");
+ }
+ OpenOptions::new()
+ .create_new(true)
+ .write(true)
+ .open("Cargo.toml")?
+ .write_all(&cargo_toml)
+}
+
+fn create_vscode_dir() -> Result<()> {
+ create_dir(".vscode").context("Failed to create the directory `.vscode`")?;
+ let vs_code_extensions_json = br#"{"recommendations":["rust-lang.rust-analyzer"]}"#;
+ OpenOptions::new()
+ .create_new(true)
+ .write(true)
+ .open(".vscode/extensions.json")?
+ .write_all(vs_code_extensions_json)?;
+
+ Ok(())
+}
+
+pub fn init_rustlings(exercises: &[Exercise]) -> Result<()> {
+ let rustlings_path = Path::new("rustlings");
+ if let Err(e) = create_dir(rustlings_path) {
+ if e.kind() == ErrorKind::AlreadyExists {
+ bail!(
+ "A directory with the name `rustligs` already exists in the current directory.
+You probably already initialized Rustlings.
+Run `cd rustlings`
+Then run `rustlings` again"
+ );
+ }
+ return Err(e.into());
+ }
+
+ set_current_dir("rustlings")
+ .context("Failed to change the current directory to `rustlings`")?;
+
+ EMBEDDED_FILES
+ .init_exercises_dir()
+ .context("Failed to initialize the `rustlings/exercises` directory")?;
+
+ create_cargo_toml(exercises).context("Failed to create the file `rustlings/Cargo.toml`")?;
+
+ create_vscode_dir().context("Failed to create the file `rustlings/.vscode/extensions.json`")?;
+
+ println!("\nDone initialization!\n");
+
+ Ok(())
+}