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}