corge/command/
init.rs

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}