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}