fe/task/
new.rs

1use clap::Args;
2use include_dir::{include_dir, Dir};
3use std::{fs, path::Path};
4
5const SRC_TEMPLATE_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/src/template/src");
6
7#[derive(Args)]
8#[clap(about = "Create new fe project")]
9pub struct NewProjectArgs {
10    name: String,
11}
12
13fn create_project(name: &str, path: &Path) {
14    for src_file in SRC_TEMPLATE_DIR.entries() {
15        let file = src_file.as_file().unwrap();
16        fs::write(path.join("src").join(file.path()), file.contents()).unwrap();
17    }
18
19    let manifest_content = format!(
20        "name = \"{name}\"
21version = \"1.0\"
22
23[dependencies]
24# my_lib = \"../my_lib\"
25# my_lib = {{ path = \"../my_lib\", version = \"1.0\" }}"
26    );
27    fs::write(path.join("fe.toml"), manifest_content).unwrap();
28}
29
30pub fn create_new_project(args: NewProjectArgs) {
31    let project_path = Path::new(&args.name);
32
33    if project_path.exists() {
34        eprintln!(
35            "Error: destination directory {} already exists",
36            project_path.canonicalize().unwrap().display(),
37        );
38        std::process::exit(1)
39    }
40
41    match fs::create_dir_all(project_path.join("src")) {
42        Ok(_) => create_project(&args.name, project_path),
43        Err(err) => {
44            eprintln!("{err}");
45            std::process::exit(1);
46        }
47    }
48    eprintln!("Created {}", project_path.display());
49}