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}