cmake-init 0.1.0

Initialize CMake project at speed
Documentation
use std::fs::{self, File};
use std::io::Write;
use std::path::Path;

pub fn src_main_cpp(mode: Option<&str>) {
    let src_dir = Path::new("./src");
    let (main_path, content);

    match mode {
        Some("CUDA") => {
            main_path = src_dir.join("main.cu");
            content = include_str!("../files/cuda/main.cu");
            if !src_dir.exists() {
                fs::create_dir_all(src_dir).expect("Failed to create src directory");
            }

            if main_path.exists() {
                return;
            }
        }
        Some("HIP") => {
            main_path = src_dir.join("main.hip");
            content = include_str!("../files/hip/main.hip");
            if !src_dir.exists() {
                fs::create_dir_all(src_dir).expect("Failed to create src directory");
            }

            if main_path.exists() {
                return;
            }
        }
        Some("MPI") => {
            main_path = src_dir.join("main.cpp");
            content = include_str!("../files/mpi/main.cpp");
            if !src_dir.exists() {
                fs::create_dir_all(src_dir).expect("Failed to create src directory");
            }

            if main_path.exists() {
                return;
            }
        }
        _ => {
            main_path = src_dir.join("main.cpp");
            content = include_str!("../files/main.cpp");
            if !src_dir.exists() {
                fs::create_dir_all(src_dir).expect("Failed to create src directory");
            }

            if main_path.exists() {
                return;
            }
        }
    }

    let mut file = File::create(&main_path).expect("Failed to create main.cpp/.cu/.hip file");
    file.write_all(content.as_bytes())
        .expect("Failed to write to main.cpp");
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_src_main_cpp() {
        src_main_cpp(Some("C++"));
        let content = std::fs::read_to_string("./src/main.cpp").unwrap();
        assert!(content.contains("int main(int argc, char* argv[]) {"));
    }

    #[test]
    fn test_src_main_cuda() {
        src_main_cpp(Some("CUDA"));
        let content = std::fs::read_to_string("./src/main.cu").unwrap();
        assert!(content.contains("__global__"));
    }

    #[test]
    fn test_src_main_hip() {
        src_main_cpp(Some("HIP"));
        let content = std::fs::read_to_string("./src/main.hip").unwrap();
        assert!(content.contains("__global__"));
    }
}