wasmer_cli/
types.rs

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}