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 }
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