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!["Id".to_string(), self.id.inner().to_string()],
111        ]);
112        table.to_string()
113    }
114
115    fn render_list_table(items: &[Self]) -> String {
116        let mut table = Table::new();
117        table.set_header(vec![
118            "App".to_string(),
119            "Version".to_string(),
120            "Created".to_string(),
121            "Id".to_string(),
122        ]);
123        table.add_rows(items.iter().map(|app| {
124            vec![
125                format!("{}/{}", app.owner.global_name, app.name),
126                app.active_version
127                    .as_ref()
128                    .map_or_else(|| "n/a".to_string(), |v| v.version.clone()),
129                app.created_at.0.clone(),
130                app.id.inner().to_string(),
131            ]
132        }));
133        table.to_string()
134    }
135}
136
137impl CliRender for DeployAppVersion {
138    fn render_item_table(&self) -> String {
139        let mut table = Table::new();
140        table.add_rows([
141            vec!["Version name".to_string(), self.version.clone()],
142            vec!["Created".to_string(), self.created_at.0.clone()],
143            vec!["Id".to_string(), self.id.inner().to_string()],
144        ]);
145        table.to_string()
146    }
147
148    fn render_list_table(items: &[Self]) -> String {
149        let mut table = Table::new();
150        table.set_header(vec![
151            "Version name".to_string(),
152            "Created".to_string(),
153            "Id".to_string(),
154        ]);
155        table.add_rows(items.iter().map(|ver| {
156            vec![
157                ver.version.clone(),
158                ver.created_at.0.clone(),
159                ver.id.inner().to_string(),
160            ]
161        }));
162        table.to_string()
163    }
164}
165
166impl CliRender for wasmer_backend_api::types::AppVersionVolume {
167    fn render_item_table(&self) -> String {
168        let mut table = Table::new();
169        table.add_rows([
170            vec!["Name".to_string(), self.name.clone()],
171            vec![
172                "Used size".to_string(),
173                format_disk_size_opt(self.used_size.clone()),
174            ],
175        ]);
176        table.to_string()
177    }
178
179    fn render_list_table(items: &[Self]) -> String {
180        let mut table = Table::new();
181        table.set_header(vec!["Name".to_string(), "Used size".to_string()]);
182        table.add_rows(items.iter().map(|vol| {
183            vec![
184                vol.name.clone(),
185                format_disk_size_opt(vol.used_size.clone()),
186            ]
187        }));
188        table.to_string()
189    }
190}
191
192impl CliRender for wasmer_backend_api::types::AppDatabase {
193    fn render_item_table(&self) -> String {
194        let mut table = Table::new();
195        table.add_rows([
196            vec!["Name".to_string(), self.name.clone()],
197            vec!["Host".to_string(), self.host.clone()],
198            vec!["Port".to_string(), self.port.clone()],
199            vec!["Username".to_string(), self.username.clone()],
200            vec![
201                "Password".to_string(),
202                self.password.clone().unwrap_or_else(|| "n/a".to_string()),
203            ],
204            vec![
205                "UI".to_string(),
206                self.db_explorer_url
207                    .clone()
208                    .unwrap_or_else(|| "n/a".to_string()),
209            ],
210        ]);
211        table.to_string()
212    }
213
214    fn render_list_table(items: &[Self]) -> String {
215        let mut table = Table::new();
216        table.set_header(vec![
217            "Name".to_string(),
218            "Host".to_string(),
219            "Port".to_string(),
220            "UI".to_string(),
221            "Password".to_string(),
222        ]);
223        table.add_rows(items.iter().map(|vol| {
224            vec![
225                vol.name.clone(),
226                vol.host.clone(),
227                vol.port.clone(),
228                vol.db_explorer_url
229                    .clone()
230                    .unwrap_or_else(|| "n/a".to_string()),
231                vol.password.clone().unwrap_or_else(|| "n/a".to_string()),
232            ]
233        }));
234        table.to_string()
235    }
236}
237
238fn format_disk_size_opt(value: Option<wasmer_backend_api::types::BigInt>) -> String {
239    let value = value.and_then(|x| {
240        let y: Option<u64> = x.0.try_into().ok();
241        y
242    });
243
244    if let Some(v) = value {
245        let s = bytesize::ByteSize(v);
246        s.to_string()
247    } else {
248        "n/a".to_string()
249    }
250}
251
252impl CliRender for Deployment {
253    fn render_item_table(&self) -> String {
254        match self {
255            Deployment::NakedDeployment(naked) => naked.render_item_table(),
256            Deployment::AutobuildRepository(build) => build.render_item_table(),
257            Deployment::Other => "unknown deployment type".to_string(),
258        }
259    }
260
261    fn render_list_table(items: &[Self]) -> String {
262        let mut table = Table::new();
263        table.set_header(vec![
264            "Id".to_string(),
265            "Type".to_string(),
266            "Created at".to_string(),
267            "Status".to_string(),
268            "App version".to_string(),
269        ]);
270
271        let rows = items
272            .iter()
273            .map(|item| match item {
274                Deployment::NakedDeployment(naked) => {
275                    vec![
276                        naked.id.inner().to_string(),
277                        "Manual".to_string(),
278                        naked.created_at.0.clone(),
279                        String::new(),
280                        naked
281                            .app_version
282                            .as_ref()
283                            .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
284                    ]
285                }
286                Deployment::AutobuildRepository(build) => {
287                    vec![
288                        build.id.inner().to_string(),
289                        "Autobuild".to_string(),
290                        build.status.as_str().to_string(),
291                        build.created_at.0.clone(),
292                    ]
293                }
294                Deployment::Other => vec![
295                    String::new(),
296                    "Unknown".to_string(),
297                    String::new(),
298                    String::new(),
299                ],
300            })
301            .collect::<Vec<_>>();
302        table.add_rows(rows);
303
304        table.to_string()
305    }
306}
307
308impl CliRender for wasmer_backend_api::types::NakedDeployment {
309    fn render_item_table(&self) -> String {
310        let mut table = Table::new();
311        table.add_rows([
312            vec!["Id".to_string(), self.id.clone().into_inner()],
313            vec!["Created at".to_string(), self.created_at.0.clone()],
314            vec![
315                "App version".to_string(),
316                self.app_version
317                    .as_ref()
318                    .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
319            ],
320        ]);
321        table.to_string()
322    }
323
324    fn render_list_table(items: &[Self]) -> String {
325        let mut table = Table::new();
326        table.set_header(vec![
327            "Id".to_string(),
328            "Created at".to_string(),
329            "App version".to_string(),
330        ]);
331        table.add_rows(items.iter().map(|item| {
332            vec![
333                item.id.clone().into_inner(),
334                item.created_at.0.clone(),
335                item.app_version
336                    .as_ref()
337                    .map_or_else(|| "n/a".to_string(), |x| x.version.clone()),
338            ]
339        }));
340        table.to_string()
341    }
342}
343
344impl CliRender for wasmer_backend_api::types::AutobuildRepository {
345    fn render_item_table(&self) -> String {
346        let mut table = Table::new();
347        table.add_rows([
348            vec!["Id".to_string(), self.id.clone().into_inner()],
349            vec!["Status".to_string(), self.status.as_str().to_string()],
350            vec!["Created at".to_string(), self.created_at.0.clone()],
351        ]);
352        table.to_string()
353    }
354
355    fn render_list_table(items: &[Self]) -> String {
356        let mut table = Table::new();
357        table.set_header(vec![
358            "Id".to_string(),
359            "Status".to_string(),
360            "Created at".to_string(),
361        ]);
362        table.add_rows(items.iter().map(|item| {
363            vec![
364                item.id.clone().into_inner(),
365                item.status.as_str().to_string(),
366                item.created_at.0.clone(),
367            ]
368        }));
369        table.to_string()
370    }
371}