coman/cli/manager_ops.rs
1use crate::{cli::manager::ManagerCommands, core::utils::merge_headers, helper, Method};
2use colored::Colorize;
3
4impl ManagerCommands {
5 pub async fn run(&self) -> Result<(), Box<dyn std::error::Error>> {
6 let manager = Self::get_manager();
7
8 match self {
9 // List collections and endpoints
10 Self::List {
11 col,
12 endpoint,
13 quiet,
14 verbose,
15 } => {
16 let collections = manager.get_collections().await;
17 if collections.is_empty() {
18 return Err("No collections found.".into());
19 } else {
20 for collection in collections {
21 if !col.is_empty() && &collection.name != col {
22 continue;
23 }
24 println!(
25 "[{}] - {}",
26 collection.name.bright_magenta(),
27 collection.url
28 );
29 if *quiet {
30 continue;
31 }
32 if !collection.headers.is_empty() {
33 println!(" Headers:");
34 for (key, value) in &collection.headers {
35 println!(" {}: {}", key.bright_cyan(), value.bright_cyan());
36 }
37 }
38 if let Some(requests) = collection.requests {
39 for request in requests {
40 if !endpoint.is_empty() && &request.name != endpoint {
41 continue;
42 }
43 println!(
44 " [{}] {} - {} - {} - {}",
45 request.name.bright_yellow(),
46 request.method.to_string().bright_green(),
47 request.endpoint.bright_white(),
48 request.headers.len(),
49 request.body.as_ref().map_or(0, |b| b.len())
50 );
51 if *verbose {
52 // check if headers present
53 if !request.headers.is_empty() {
54 println!(" Headers:");
55 for (key, value) in &request.headers {
56 println!(
57 " {}: {}",
58 key.bright_cyan(),
59 value.bright_cyan()
60 );
61 }
62 }
63 // check if body present
64 if request.body.is_some() {
65 println!(" Body:");
66 if let Some(body) = &request.body {
67 println!(" {}", body.bright_cyan());
68 };
69 }
70 }
71 }
72 }
73 }
74 }
75 }
76
77 // Delete a collection or endpoint
78 Self::Delete {
79 collection,
80 endpoint,
81 yes,
82 } => {
83 if endpoint.is_empty() {
84 // Deleting a collection
85 println!("Deleting collection '{}'", collection);
86 let confirm = if !yes {
87 helper::confirm("Are you sure you want to delete this collection?")
88 } else {
89 true
90 };
91 if confirm {
92 manager.delete_collection(collection).await?;
93 println!("Collection deleted successfully!");
94 } else {
95 return Err("Deletion cancelled.".into());
96 }
97 } else {
98 // Deleting an endpoint
99 println!("Deleting endpoint '{}'", endpoint);
100 let confirm = if !yes {
101 helper::confirm("Are you sure you want to delete this endpoint?")
102 } else {
103 true
104 };
105 if confirm {
106 manager.delete_endpoint(collection, endpoint).await?;
107 println!("Endpoint deleted successfully!");
108 } else {
109 return Err("Deletion cancelled.".into());
110 }
111 }
112 }
113
114 // Copy a collection or endpoint
115 Self::Copy {
116 collection,
117 endpoint,
118 to_col,
119 new_name,
120 } => {
121 if endpoint.is_empty() {
122 // Copy collection
123 manager.copy_collection(collection, new_name).await?;
124 } else if *to_col {
125 // Copy endpoint to another collection
126 manager
127 .copy_endpoint(collection, endpoint, new_name, Some(new_name))
128 .await?;
129 } else {
130 // Copy endpoint with new name in same collection
131 manager
132 .copy_endpoint(collection, endpoint, new_name, None)
133 .await?;
134 }
135 println!("Copy command successful!");
136 }
137
138 // Update a collection or endpoint headers and body
139 Self::Update {
140 collection,
141 endpoint,
142 url,
143 headers,
144 body,
145 } => {
146 let mut col = manager
147 .get_collection(collection)
148 .await?
149 .ok_or("Collection not found")?;
150 if endpoint.is_empty() {
151 // Update collection
152 let url_opt = if url.is_empty() {
153 None
154 } else {
155 Some(url.as_str())
156 };
157 let headers_opt = if headers.is_empty() {
158 None
159 } else {
160 Some(headers.clone())
161 };
162 col.url = url_opt.unwrap_or(&col.url).to_string();
163 col.headers =
164 merge_headers(col.headers.clone(), &headers_opt.unwrap_or(vec![]));
165 manager.update_add_collection(col).await?;
166 } else {
167 // let mut ep = manager
168 // .get_endpoint(collection, endpoint)
169 // .await?
170 // .ok_or("Endpoint not found")?;
171 let ep = col
172 .requests
173 .as_mut()
174 .and_then(|reqs| reqs.iter_mut().find(|r| r.name == *endpoint))
175 .ok_or("Endpoint not found")?;
176 // Update endpoint
177 if !url.is_empty() {
178 ep.endpoint = url.clone();
179 }
180 if !headers.is_empty() {
181 ep.headers = headers.clone();
182 }
183 let body_opt = if body.is_empty() {
184 None
185 } else if body.trim().is_empty() {
186 Some(String::new())
187 } else {
188 Some(body.to_string())
189 };
190
191 ep.body = if let Some(b) = body_opt {
192 Some(b)
193 } else {
194 ep.body.clone()
195 };
196 manager
197 .update_endpoint(
198 collection,
199 &ep.name,
200 Some(&ep.endpoint),
201 Some(ep.headers.clone()),
202 ep.body.clone(),
203 )
204 .await?;
205 }
206 println!("Collection updated successfully!");
207 }
208
209 // Add a new collection or update an existing one
210 Self::Col { name, url, headers } => {
211 manager.add_collection(name, url, headers.clone()).await?;
212 println!("Collection added successfully!");
213 }
214
215 // Add a new endpoint to a collection or update an existing one
216 Self::Endpoint {
217 collection,
218 name,
219 path,
220 method,
221 headers,
222 body,
223 } => {
224 let method: Method = method
225 .to_uppercase()
226 .parse()
227 .map_err(|_| format!("Invalid HTTP method: {}", method))?;
228
229 let body_opt = if body.trim().is_empty() {
230 None
231 } else {
232 Some(body.clone())
233 };
234
235 manager
236 .add_endpoint(collection, name, path, method, headers.clone(), body_opt)
237 .await?;
238 println!("Endpoint added successfully!");
239 }
240 }
241
242 Ok(())
243 }
244}