cargo_newcpp/
lib.rs

1use std::fs;
2use std::fs::File;
3use std::io::prelude::*;
4
5mod cpp_scafolding;
6mod cmake;
7mod readme;
8pub mod command_helper;
9
10pub use cpp_scafolding::*;
11pub use std::error::Error;
12
13pub fn make_project_dir(project_dir: &str) -> std::io::Result<()> {
14    fs::create_dir(project_dir)?;
15    Ok(())
16}
17
18pub fn make_defaults(project_dir: &str, is_library: bool) -> Result<(),Box<dyn Error>> {
19
20    if is_library{
21        make_default_files(project_dir, FileTypes::Library )?;
22
23        let lib_template = include_str!("../templates/fs/CMakeLists.txt.lib.in");
24        let cmake_template = cmake::get_cmake(project_dir, lib_template)?;
25        make_default_files(project_dir, FileTypes::Cmake(&cmake_template) )?;
26    
27    }else{
28        make_default_files(project_dir, FileTypes::Main )?;
29    
30        let exe_template = include_str!("../templates/fs/CMakeLists.txt.exe.in");
31        let cmake_template = cmake::get_cmake(project_dir, exe_template)?;
32        make_default_files(project_dir, FileTypes::Cmake(&cmake_template) )?;
33    }
34
35    make_default_files(project_dir, FileTypes::Header )?;
36    make_default_files(project_dir, FileTypes::GitIgnore)?;
37    
38    let template_readme = include_str!("../templates/fs/README.md.in");
39    let readme_template = readme::get_readme(project_dir, template_readme)?;
40    make_default_files(project_dir, FileTypes::ReadMe(&readme_template) )?;
41
42    make_default_files(project_dir, FileTypes::UnitTestExample )?;
43    make_default_files(project_dir, FileTypes::CmakeTest )?;
44
45    make_default_files(project_dir, FileTypes::CmakeModule )?;
46
47
48    Ok(())
49}
50
51fn make_default_files(project_dir: &str, filetype: FileTypes  ) -> std::io::Result<()> {
52    match filetype {
53        FileTypes::Main => {            
54            let mut file = File::create(project_dir.to_owned() + "/src/main.cpp")?;
55            let template = include_str!("../templates/fs/src/main.cpp.in");
56            file.write_all(template.as_bytes())?;
57        
58        }
59
60        FileTypes::Library => {            
61            let mut file = File::create(project_dir.to_owned() + "/src/mylibrary.cpp")?;
62            let template = include_str!("../templates/fs/src/mylibrary.cpp.in");
63            file.write_all(template.as_bytes())?;
64        
65        }        
66        FileTypes::Header => {
67            let mut file = File::create(project_dir.to_owned() + "/include/dummy.hpp")?;
68            let template = include_str!("../templates/fs/include/dummy.hpp.in");
69            file.write_all(template.as_bytes())?;
70        
71        }
72        FileTypes::Cmake(value) => {
73            let mut file = File::create(project_dir.to_owned() + "/CMakeLists.txt")?;
74            file.write_all(value.as_bytes())?;
75        
76        }
77        FileTypes::CmakeTest => {
78            let mut file = File::create(project_dir.to_owned() + "/tests/CMakeLists.txt")?;
79            let template = include_str!("../templates/fs/test/CMakeGTest.make.in");
80            file.write_all(template.as_bytes())?;        
81            //file.write_all(value.as_bytes())?;        
82        }
83        
84        FileTypes::UnitTestExample => {
85            let mut file = File::create(project_dir.to_owned() + "/tests/example_test.cpp")?;
86            let template = include_str!("../templates/fs/test/example_test.cpp.in");
87            file.write_all(template.as_bytes())?;        
88        }
89        FileTypes::GitIgnore => {
90            let mut file = File::create(project_dir.to_owned() + "/.gitignore")?;
91            let template = include_str!("../templates/fs/gitignore.in");
92            file.write_all(template.as_bytes())?;        
93        }
94        FileTypes::ReadMe(value) => {
95            let mut file = File::create(project_dir.to_owned() + "/README.md")?;
96            file.write_all(value.as_bytes())?;        
97        },
98        FileTypes::CmakeModule => {
99            let files = vec![
100                "cmake/eigen.cmake",
101                "cmake/fftw.cmake",
102                "cmake/json.cmake",
103                "cmake/gtest.cmake",
104                "cmake/opencv.cmake",
105            ];
106            let templates = vec![
107                include_str!("../templates/fs/cmake/eigen.cmake"),
108                include_str!("../templates/fs/cmake/fftw.cmake"),  
109                include_str!("../templates/fs/cmake/json.cmake"),
110                include_str!("../templates/fs/cmake/gtest.cmake"),
111                include_str!("../templates/fs/cmake/opencv.cmake"),
112            ];
113
114            files.iter().zip(templates.iter()).for_each(|(file, template)| {
115                let mut file = File::create(project_dir.to_owned() + "/" + file).expect(&format!("Failed to create file: {:?}", file));
116                file.write_all(template.as_bytes()).expect(&format!("Failed to write to file: {:?}", file));
117            });
118        }
119        
120    }
121
122    Ok(())
123}
124
125pub enum FileTypes<'a>{
126    Main,
127    Library,
128    Header,
129    Cmake(&'a str),
130    CmakeModule,
131    CmakeTest,
132    GitIgnore,
133    UnitTestExample,
134    ReadMe(&'a str),
135}
136