Skip to main content

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}