1use comfy_table::Table;
2use wasmer_backend_api::types::{
3 DeployApp, DeployAppVersion, Deployment, DnsDomain, DnsDomainWithRecords, Namespace,
4};
5
6use crate::utils::render::CliRender;
7
8impl CliRender for DnsDomain {
9 fn render_item_table(&self) -> String {
10 let mut table = Table::new();
11 table.add_rows([vec!["Domain".to_string(), self.name.clone()]]);
12 table.to_string()
13 }
14
15 fn render_list_table(items: &[Self]) -> String {
16 if items.is_empty() {
17 return String::new();
18 }
19 let mut table = Table::new();
20 table.set_header(vec!["Domain".to_string(), "Owner".to_string()]);
21 table.add_rows(
22 items
23 .iter()
24 .map(|ns| vec![ns.name.clone(), ns.owner.global_name.clone()]),
25 );
26 table.to_string()
27 }
28}
29
30impl CliRender for DnsDomainWithRecords {
31 fn render_item_table(&self) -> String {
32 let mut output = String::new();
33 let mut table = Table::new();
34 table
35 .load_preset(comfy_table::presets::UTF8_FULL_CONDENSED)
36 .set_header(vec![
37 "Type".to_string(),
38 "Name".to_string(),
39 "TTL".to_string(),
40 "Value".to_string(),
41 ]);
42 let mut rows: Vec<Vec<String>> = vec![];
43 if let Some(ref records) = self.records {
44 records.iter().flatten().for_each(|record| {
45 rows.push(vec![
46 record.record_type().to_string(),
47 record.name().unwrap_or("<no name>").to_string(),
48 record
49 .ttl()
50 .expect("expected a TTL value for record")
51 .to_string(),
52 record.text().to_string(),
53 ]);
54 });
55 }
56
57 table.add_rows(rows);
58 output += &table.to_string();
59 output
60 }
61
62 fn render_list_table(items: &[Self]) -> String {
63 if items.is_empty() {
64 return String::new();
65 }
66 let mut table = Table::new();
67 table.set_header(vec!["Domain".to_string()]);
68 table.add_rows(items.iter().map(|ns| vec![ns.name.clone()]));
69 table.to_string()
70 }
71}
72
73impl CliRender for Namespace {
74 fn render_item_table(&self) -> String {
75 let mut table = Table::new();
76 table.add_rows([
77 vec!["Namespace".to_string(), self.name.clone()],
78 vec!["Id".to_string(), self.id.inner().to_string()],
79 ]);
80 table.to_string()
81 }
82
83 fn render_list_table(items: &[Self]) -> String {
84 let mut table = Table::new();
85 table.set_header(vec!["Namespace".to_string(), "Id".to_string()]);
86 table.add_rows(
87 items
88 .iter()
89 .map(|ns| vec![ns.name.clone(), ns.id.inner().to_string()]),
90 );
91 table.to_string()
92 }
93}
94
95impl CliRender for DeployApp {
96 fn render_item_table(&self) -> String {
97 let mut table = Table::new();
98 table.add_rows([
99 vec![
100 "App".to_string(),
101 format!("{}/{}", self.owner.global_name, self.name),
102 ],
103 vec![
104 "Version".to_string(),
105 self.active_version
106 .as_ref()
107 .map_or_else(|| "n/a".to_string(), |v| v.version.clone()),
108 ],
109 vec!["Created".to_string(), self.created_at.0.clone()],
110 vec!["Updated".to_string(), self.updated_at.0.clone()],
111 vec!["Id".to_string(), self.id.inner().to_string()],
112 ]);
113 table.to_string()
114 }
115
116 fn render_list_table(items: &[Self]) -> String {
117 let mut table = Table::new();
118 table.set_header(vec![
119 "App".to_string(),
120 "Version".to_string(),
121 "Created".to_string(),
122 "Updated".to_string(),
123 "Id".to_string(),
124 ]);
125 table.add_rows(items.iter().map(|app| {
126 vec![
127 format!("{}/{}", app.owner.global_name, app.name),
128 app.active_version
129 .as_ref()
130 .map_or_else(|| "n/a".to_string(), |v| v.version.clone()),
131 app.created_at.0.clone(),
132 app.updated_at.0.clone(),
133 app.id.inner().to_string(),
134 ]
135 }));
136 table.to_string()
137 }
138}
139
140impl CliRender for DeployAppVersion {
141 fn render_item_table(&self) -> String {
142 let mut table = Table::new();
143 table.add_rows([
144 vec!["Version name".to_string(), self.version.clone()],
145 vec!["Created".to_string(), self.created_at.0.clone()],
146 vec!["Id".to_string(), self.id.inner().to_string()],
147 ]);
148 table.to_string()
149 }
150
151 fn render_list_table(items: &[Self]) -> String {
152 let mut table = Table::new();
153 table.set_header(vec![
154 "Version name".to_string(),
155 "Created".to_string(),
156 "Id".to_string(),
157 ]);
158 table.add_rows(items.iter().map(|ver| {
159 vec![
160 ver.version.clone(),
161 ver.created_at.0.clone(),
162 ver.id.inner().to_string(),
163 ]
164 }));
165 table.to_string()
166 }
167}
168
169impl CliRender for wasmer_backend_api::types::AppVersionVolume {
170 fn render_item_table(&self) -> String {
171 let mut table = Table::new();
172 table.add_rows([
173 vec!["Name".to_string(), self.name.clone()],
174 vec![
175 "Used size".to_string(),
176 format_disk_size_opt(self.used_size.clone()),
177 ],
178 ]);
179 table.to_string()
180 }
181
182 fn render_list_table(items: &[Self]) -> String {
183 let mut table = Table::new();
184 table.set_header(vec!["Name".to_string(), "Used size".to_string()]);
185 table.add_rows(items.iter().map(|vol| {
186 vec![
187 vol.name.clone(),
188 format_disk_size_opt(vol.used_size.clone()),
189 ]
190 }));
191 table.to_string()
192 }
193}
194
195impl CliRender for wasmer_backend_api::types::AppDatabase {
196 fn render_item_table(&self) -> String {
197 let mut table = Table::new();
198 table.add_rows([
199 vec!["Name".to_string(), self.name.clone()],
200 vec!["Host".to_string(), self.host.clone()],
201 vec!["Port".to_string(), self.port.clone()],
202 vec!["Username".to_string(), self.username.clone()],
203 vec![
204 "Password".to_string(),
205 self.password.clone().unwrap_or_else(|| "n/a".to_string()),
206 ],
207 vec![
208 "UI".to_string(),
209 self.db_explorer_url
210 .clone()
211 .unwrap_or_else(|| "n/a".to_string()),
212 ],
213 ]);
214 table.to_string()
215 }
216
217 fn render_list_table(items: &[Self]) -> String {
218 let mut table = Table::new();
219 table.set_header(vec![
220 "Name".to_string(),
221 "Host".to_string(),
222 "Port".to_string(),
223 "UI".to_string(),
224 "Password".to_string(),
225 ]);
226 table.add_rows(items.iter().map(|vol| {
227 vec![
228 vol.name.clone(),
229 vol.host.clone(),
230 vol.port.clone(),
231 vol.db_explorer_url
232 .clone()
233 .unwrap_or_else(|| "n/a".to_string()),
234 vol.password.clone().unwrap_or_else(|| "n/a".to_string()),
235 ]
236 }));
237 table.to_string()
238 }
239}
240
241fn format_disk_size_opt(value: Option<wasmer_backend_api::types::BigInt>) -> String {
242 let value = value.and_then(|x| {
243 let y: Option<u64> = x.0.try_into().ok();
244 y
245 });
246
247 if let Some(v) = value {
248 let s = bytesize::ByteSize(v);
249 s.to_string()
250 } else {
251 "n/a".to_string()
252 }
253}
254
255impl CliRender for Deployment {
256 fn render_item_table(&self) -> String {
257 match self {
258 Deployment::NakedDeployment(naked) => naked.render_item_table(),
259 Deployment::AutobuildRepository(build) => build.render_item_table(),
260 Deployment::Other => "unknown deployment type".to_string(),
261 }
262 }
263
264 fn render_list_table(items: &[Self]) -> String {
265 let mut table = Table::new();
266 table.set_header(vec![
267 "Id".to_string(),
268 "Type".to_string(),
269 "Created at".to_string(),
270 "Status".to_string(),
271 "App version".to_string(),
272 ]);
273
274 let rows = items
275 .iter()
276 .map(|item| match item {
277 Deployment::NakedDeployment(naked) => {
278 vec![
279 naked.id.inner().to_string(),
280 "Manual".to_string(),
281 naked.created_at.0.clone(),
282 String::new(),
283 naked
284 .app_version
285 .as_ref()
286 .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
287 ]
288 }
289 Deployment::AutobuildRepository(build) => {
290 vec![
291 build.id.inner().to_string(),
292 "Autobuild".to_string(),
293 build.status.as_str().to_string(),
294 build.created_at.0.clone(),
295 ]
296 }
297 Deployment::Other => vec![
298 String::new(),
299 "Unknown".to_string(),
300 String::new(),
301 String::new(),
302 ],
303 })
304 .collect::<Vec<_>>();
305 table.add_rows(rows);
306
307 table.to_string()
308 }
309}
310
311impl CliRender for wasmer_backend_api::types::NakedDeployment {
312 fn render_item_table(&self) -> String {
313 let mut table = Table::new();
314 table.add_rows([
315 vec!["Id".to_string(), self.id.clone().into_inner()],
316 vec!["Created at".to_string(), self.created_at.0.clone()],
317 vec![
318 "App version".to_string(),
319 self.app_version
320 .as_ref()
321 .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
322 ],
323 ]);
324 table.to_string()
325 }
326
327 fn render_list_table(items: &[Self]) -> String {
328 let mut table = Table::new();
329 table.set_header(vec![
330 "Id".to_string(),
331 "Created at".to_string(),
332 "App version".to_string(),
333 ]);
334 table.add_rows(items.iter().map(|item| {
335 vec![
336 item.id.clone().into_inner(),
337 item.created_at.0.clone(),
338 item.app_version
339 .as_ref()
340 .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
341 ]
342 }));
343 table.to_string()
344 }
345}
346
347impl CliRender for wasmer_backend_api::types::AutobuildRepository {
348 fn render_item_table(&self) -> String {
349 let mut table = Table::new();
350 table.add_rows([
351 vec!["Id".to_string(), self.id.clone().into_inner()],
352 vec!["Status".to_string(), self.status.as_str().to_string()],
353 vec!["Created at".to_string(), self.created_at.0.clone()],
354 ]);
355 table.to_string()
356 }
357
358 fn render_list_table(items: &[Self]) -> String {
359 let mut table = Table::new();
360 table.set_header(vec![
361 "Id".to_string(),
362 "Status".to_string(),
363 "Created at".to_string(),
364 ]);
365 table.add_rows(items.iter().map(|item| {
366 vec![
367 item.id.clone().into_inner(),
368 item.status.as_str().to_string(),
369 item.created_at.0.clone(),
370 ]
371 }));
372 table.to_string()
373 }
374}