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#[derive(Parser, Debug)]
12pub struct Args {
13 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}