1use std::fs;
2use git2::Repository;
3use std::error::Error;
4use colored::*;
5
6pub mod utils;
7use utils::helpers::*;
8use utils::constants::*;
9pub use utils::command_arguments::*;
10
11
12pub fn resolve(args: ClapperArgs) -> Result<(), Box<dyn Error>> {
13 match args.entity_type {
14 EntityType::Get(get_command) => {
15 match get_command.command {
16 GetSubCommand::Dhjs(dir) => {
17 match Repository::clone(GIT_DIAMOND_HARDHAT_JS_URL, &dir.dir_name) {
18 Ok(_) => {
19 println!("{}", "Successfully cloned diamond standard hardhat JS project!".bright_blue());
20 remove_git_dir(&dir.dir_name);
21 },
22 Err(e) => {
23 return Err(format!("Failed to clone project: {}", e).into())
24 }
25 }
26 },
27 GetSubCommand::Dhts(dir) => {
28 match Repository::clone(GIT_DIAMOND_HARDHAT_TS_URL, &dir.dir_name) {
29 Ok(_) => {
30 println!("{}", "Successfully cloned diamond standard hardhat TS project!".bright_blue());
31 remove_git_dir(&dir.dir_name);
32 },
33 Err(e) => {
34 return Err(format!("Failed to clone project: {}", e).into())
35 }
36 }
37 },
38 GetSubCommand::Dfd(dir) => {
39 match Repository::clone(GIT_DIAMOND_FOUNDRY_URL, &dir.dir_name) {
40 Ok(_) => {
41 println!("{}", "Successfully cloned diamond standard foundry project!".bright_blue());
42 remove_git_dir(&dir.dir_name);
43 },
44 Err(e) => {
45 return Err(format!("Failed to clone project: {}", e).into())
46 }
47 }
48 },
49 GetSubCommand::Nestjs(dir) => {
50 match Repository::clone(GIT_NEST_JS_URL, &dir.dir_name){
51 Ok(_) => {
52 println!("{}", "Successfully cloned a NestJS project!".bright_blue());
53 remove_git_dir(&dir.dir_name);
54 },
55 Err(e) => {
56 return Err(format!("Failed to clone project: {}", e).into())
57 }
58 }
59 },
60 };
61 },
62 EntityType::Scaffold(scaffold_command) => {
63 match scaffold_command.command {
64 ScaffoldSubCommand::Reactjs(dir) => {
65 match create_react_app(dir.dir_name.clone()) {
66 Ok(_) => println!("{}", "Successfully created the React project!".bright_blue()),
67 Err(e) => {
68 return Err(e);
69 }
70 }
71 },
72 ScaffoldSubCommand::Reactts(dir) => {
73 match create_react_app_with_typescript(dir.dir_name.clone()) {
74 Ok(_) => println!("{}", "Successfully created the TypeScript React project!".bright_blue()),
75 Err(e) => {
76 return Err(e);
77 }
78 }
79 },
80 ScaffoldSubCommand::Hardhat(dir) => {
81 match create_hardhat_project(dir.dir_name.clone()) {
82 Ok(_) => println!("{}", "Successfully created the Hardhat project!".bright_blue()),
83 Err(e) => {
84 return Err(e);
85 }
86 }
87 },
88 ScaffoldSubCommand::Nestjs(dir) => {
89 match create_nestjs_app(dir.dir_name.clone()) {
90 Ok(_) => println!("{}", "Successfully created the Nestjs project!".bright_blue()),
91 Err(e) => {
92 return Err(e);
93 }
94 }
95 },
96 ScaffoldSubCommand::Laravel(dir) => {
97 match create_laravel_project(dir.dir_name.clone()) {
98 Ok(_) => println!("{}", "Successfully created the Laravel project!".bright_blue()),
99 Err(e) => {
100 return Err(e);
101 }
102 }
103 },
104 ScaffoldSubCommand::Nextjs(dir) => {
105 match create_next_app(dir.dir_name.clone()) {
106 Ok(_) => println!("{}", "Successfully created the Next application!".bright_blue()),
107 Err(e) => {
108 return Err(e);
109 }
110 }
111 },
112 ScaffoldSubCommand::Foundry(dir) => {
113 match create_new_foundry_project(dir.dir_name.clone()) {
114 Ok(_) => println!("{}", "Successfully created the Foundry application!".bright_blue()),
115 Err(e) => {
116 return Err(e);
117 }
118 }
119 },
120 ScaffoldSubCommand::Vue(dir) => {
121 match create_vue_project(dir.dir_name.clone()) {
122 Ok(_) => println!("{}", "Successfully created a Vue application!".bright_blue()),
123 Err(e) => {
124 return Err(e);
125 }
126 }
127 },
128 ScaffoldSubCommand::Vite(dir) => {
129 match create_vite_project(dir.dir_name.clone()) {
130 Ok(_) => println!("{}", "Successfully created a Vite project!".bright_blue()),
131 Err(e) => {
132 return Err(e);
133 }
134 }
135 },
136 ScaffoldSubCommand::Noir(dir) => {
137 match create_noir_project(dir.dir_name.clone()) {
138 Ok(_) => println!("{}", "Successfully created a Noir project!".bright_blue()),
139 Err(e) => {
140 return Err(e);
141 }
142 }
143 },
144 ScaffoldSubCommand::Snforge(dir) => {
145 match create_starknet_foundry_project(dir.dir_name.clone()) {
146 Ok(_) => println!("{}", "Successfully created a starknet foundry project!".bright_blue()),
147 Err(e) => {
148 return Err(e);
149 }
150 }
151 }
152 }
153 },
154 EntityType::Install(install_command) => {
155 match install_command.command {
156 InstallSubCommand::Brew => {
157 match install_brew() {
158 Ok(_) => println!("{}", "Homebrew installation successful!".bright_blue()),
159 Err(e) => {
160 return Err(e);
161 }
162 }
163 },
164 InstallSubCommand::Choco => {
165 match install_choco() {
166 Ok(_) => println!("{}", "Chocolatey installation successful!".bright_blue()),
167 Err(e) => {
168 return Err(e);
169 }
170 }
171 },
172 InstallSubCommand::Node => {
173 match install_node() {
174 Ok(_) => println!("{}", "Node.js installation successful!".bright_blue()),
175 Err(e) => {
176 return Err(e);
177 }
178 }
179 },
180 InstallSubCommand::Scarb => {
181 match install_scarb() {
182 Ok(_) => println!("{}", "Scarb installation successful!".bright_blue()),
183 Err(e) => {
184 return Err(e);
185 }
186 }
187 },
188 InstallSubCommand::Forge => {
189 match install_forge() {
190 Ok(_) => println!("{}", "Forge installation successful!".bright_blue()),
191 Err(e) => {
192 return Err(e);
193 }
194 }
195 },
196 InstallSubCommand::Starkli => {
197 match install_starkli() {
198 Ok(_) => println!("{}", "Starkli installation successful!".bright_blue()),
199 Err(e) => {
200 return Err(e);
201 }
202 }
203 },
204 InstallSubCommand::Noir => {
205 match install_nargo() {
206 Ok(_) => println!("{}", "Noturup installation successful!".bright_blue()),
207 Err(e) => {
208 return Err(e);
209 }
210 }
211 },
212 InstallSubCommand::Snfoundry(version) => {
213 match install_snforge(version.version_name.clone()) {
214 Ok(_) => println!("{}", "Starknet Foundry installation successful!".bright_blue()),
215 Err(e) => {
216 return Err(e)
217 }
218 }
219 }
220 }
221 }
222 }
223
224 Ok(())
225}
226
227fn remove_git_dir(dir_name: &String) {
228 let git_dir = format!("{}/.git", dir_name);
229 if fs::remove_dir_all(&git_dir).is_err() {
230 println!("Warning: Failed to remove .git directory");
231 }
232}