1use crate::cli::InitArgs;
2use anyhow::{Context, Result};
3use std::fs;
4use std::process::Command;
5use crate::std_command_ext::ExecuteCommand;
6
7const MAIN_C_CONTENT: &str = r###"
8int main() {
9 return 0;
10}
11"###;
12
13const GITIGNORE_CONTENT: &str = r###"
14.idea/
15.vscode/
16target/
17dependency/
18compilation_database/
19.env
20"###;
21
22const BUILD_YAML_CONTENT: &str = r###"
23project:
24 name: {{name}}
25 version: 1.0.0
26
27profiles:
28 release:
29 optimization_level: O
30 development:
31 optimization_level: None
32"###;
33
34pub fn init(init_args: InitArgs) -> Result<()> {
35 let project_name = init_args.path.file_name().unwrap().to_str().unwrap();
36
37 log::info!("Initializing project in directory {:?}", init_args.path);
38
39 let directory_exists = fs::exists(&init_args.path)
40 .with_context(|| format!("Failed to check if directory {:?} exists", init_args.path))?;
41
42 if directory_exists {
43 let read_dir = fs::read_dir(&init_args.path)
44 .with_context(|| format!("Failed to read directory {:?}", &init_args.path))?;
45
46 if read_dir.count() > 0 {
47 return Err(anyhow::anyhow!("Directory {:?} is not empty", &init_args.path));
48 }
49 }
50
51 let src_dir = init_args.path.join("src");
52 fs::create_dir_all(&src_dir)
53 .with_context(|| format!("Failed to create directory {:?}", &src_dir))?;
54
55 let main_c_content = MAIN_C_CONTENT.trim_start();
56 fs::write(&src_dir.join("main.c"), main_c_content)
57 .with_context(|| format!("Failed to create file {:?}", &src_dir.join("main.c")))?;
58
59 let build_yaml_content = BUILD_YAML_CONTENT
60 .trim_start()
61 .replace("{{name}}", project_name);
62
63 fs::write(init_args.path.join("build.yaml"), build_yaml_content)
64 .with_context(|| format!("Failed to create file {:?}", &src_dir))?;
65
66 if !init_args.no_git {
67 Command::new("git")
68 .arg("init")
69 .current_dir(&init_args.path)
70 .execute(true)
71 .with_context(|| format!("Failed to initialize git repository in {:?}", &init_args.path))?;
72
73 let gitignore_content = GITIGNORE_CONTENT.trim_start();
74 fs::write(&init_args.path.join(".gitignore"), gitignore_content)
75 .with_context(|| format!("Failed to create file {:?}", &src_dir))?;
76 }
77
78 log::info!("PROJECT SUCCESSFULLY INITIALIZED");
79 Ok(())
80}