cargo_newaoc/
lib.rs

1use clap::Parser;
2use std::env;
3use std::fs;
4use std::fs::File;
5use std::path::Path;
6use std::process::Command;
7
8const MAIN_RS: &str = include_str!("main_rs_template.rs");
9
10/// A program that facilitates creating Rust projects for Advent of Code solutions
11#[derive(Parser, Debug)]
12pub struct Args {
13    /// Name of the project (will be run with `cargo new`)
14    name: String,
15}
16
17pub fn run(args: Args) {
18    println!("WARNING: NOT FULLY TESTED, SO USE WITH CAUTION");
19    let Args { name } = args;
20    let exec = &format!("cargo new {name}");
21    let status = if cfg!(target_os = "windows") {
22        Command::new("cmd").args(["/C", exec]).status()
23    } else {
24        Command::new("sh").args(["-c", exec]).status()
25    };
26    match status {
27        Ok(exit_status) => println!("cargo finished with status {exit_status}"),
28        Err(e) => return eprintln!("error: {e:?}; exiting"),
29    }
30    let project_dir = Path::new(&name);
31    match env::set_current_dir(project_dir) {
32        Ok(_) => println!("successfully changed cwd to {}", project_dir.display()),
33        Err(e) => {
34            return eprintln!(
35                "failed to change directory to {}: {e:?}",
36                project_dir.display()
37            )
38        }
39    }
40    match fs::write("src/main.rs", MAIN_RS) {
41        Ok(_) => println!("successfully wrote to src/main.rs"),
42        Err(e) => return eprintln!("failed to write template to src/main.rs: {e:?}"),
43    }
44    match File::create("src/input.txt") {
45        Ok(_) => println!("successfully created src/input.txt"),
46        Err(e) => eprintln!("failed to create src/input.txt: {e:?}"),
47    }
48    println!(
49        "change directory into {} and happy coding!",
50        project_dir.display()
51    );
52}