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