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                    // Update endpoint
172                    let url_opt = if url.is_empty() {
173                        None
174                    } else {
175                        Some(url.as_str())
176                    };
177                    let headers_opt = if headers.is_empty() {
178                        None
179                    } else {
180                        Some(headers)
181                    };
182                    let body_opt = if body.is_empty() {
183                        Some(String::new()) // Empty body clears the existing body
184                    } else {
185                        Some(body.clone())
186                    };
187                    ep.endpoint = url_opt.unwrap_or(&ep.endpoint).to_string();
188                    ep.headers = if let Some(h) = headers_opt {
189                        h.clone()
190                    } else {
191                        ep.headers.clone()
192                    };
193                    ep.body = body_opt;
194                    manager
195                        .update_endpoint(
196                            collection,
197                            &ep.name,
198                            url_opt,
199                            Some(ep.headers),
200                            ep.body.clone(),
201                        )
202                        .await?;
203                }
204                println!("Collection updated successfully!");
205            }
206
207            // Add a new collection or update an existing one
208            Self::Col { name, url, headers } => {
209                manager.add_collection(name, url, headers.clone()).await?;
210                println!("Collection added successfully!");
211            }
212
213            // Add a new endpoint to a collection or update an existing one
214            Self::Endpoint {
215                collection,
216                name,
217                path,
218                method,
219                headers,
220                body,
221            } => {
222                let method: Method = method
223                    .to_uppercase()
224                    .parse()
225                    .map_err(|_| format!("Invalid HTTP method: {}", method))?;
226
227                let body_opt = if body.trim().is_empty() {
228                    None
229                } else {
230                    Some(body.clone())
231                };
232
233                manager
234                    .add_endpoint(collection, name, path, method, headers.clone(), body_opt)
235                    .await?;
236                println!("Endpoint added successfully!");
237            }
238        }
239
240        Ok(())
241    }
242}