jirust_cli/utils/
table_printer.rs

1use prettytable::{Attr, Cell, Row, color};
2use std::collections::HashMap;
3
4use jira_v3_openapi::models::{
5    CreatedIssue, FieldCreateMetadata, IssueBean, IssueTransition, IssueTypeIssueCreateMetadata,
6    Project, ProjectCategory, Version,
7};
8
9use super::PrintableData;
10
11/// This function allows to print the objects details in a pretty way (full data).
12///
13/// It uses the prettytable library to print the version details.
14///
15/// # Arguments
16///
17/// * `data` - A TablePrintable enum
18///     * Project: A vector of Project structs
19///     * Version: A vector of Version structs
20///     * IssueType: A vector of IssueType structs
21///     * IssueTypeFields: A vector of IssueTypeFields structs
22///     * IssueCreated: A vector of CreatedIssue structs
23///     * IssueData: A vector of IssueBean structs
24///     * IssueTransition: A vector of IssueTransition structs
25///     * TransitionedIssue: A vector of TransitionedIssue structs
26///     * VersionRelatedWork: A vector of VersionRelatedWork structs
27///     * Generic: A vector of Generic JSON values
28///
29///
30/// # Examples
31///
32/// ```
33/// use jira_v3_openapi::models::Version;
34/// use jirust_cli::utils::{PrintableData, table_printer::print_table_full};
35///
36/// let versions: Vec<Version> = vec![Version::new()];
37///
38/// print_table_full(PrintableData::Version{ versions });
39/// ```
40///
41pub fn print_table_full(data: PrintableData) {
42    let mut table = prettytable::Table::new();
43    match data {
44        PrintableData::Generic { data } => todo!("To Be Implemented! {:?}", data),
45        PrintableData::IssueCreated { issues } => {
46            table.add_row(row![
47                bFC->"Issue ID",
48                bFy->"Issue Key",
49                bFm->"Issue URL",
50            ]);
51            for issue in issues {
52                table.add_row(row![
53                    Fc->issue.id.unwrap_or("".to_string()),
54                    Fy->issue.key.unwrap_or("".to_string()),
55                    Fm->issue.param_self.unwrap_or("".to_string()),
56                ]);
57            }
58        }
59        PrintableData::IssueData { issues } => {
60            table.add_row(row![
61                bFC->"Issue ID",
62                bFy->"Issue Key",
63                bFm->"Issue Fields",
64                bFw->"Issue Transitions"
65            ]);
66            for issue in issues {
67                let fields = issue
68                    .fields
69                    .unwrap_or(HashMap::new())
70                    .iter()
71                    .map(|field| format!("{}: {:?}", field.0, field.1.to_string()))
72                    .collect::<Vec<String>>()
73                    .join(", ");
74                let transitions = issue
75                    .transitions
76                    .unwrap_or_default()
77                    .iter()
78                    .map(|transition| {
79                        format!(
80                            "{}: {} ({})",
81                            transition.clone().id.unwrap_or_default(),
82                            transition.clone().name.unwrap_or_default(),
83                            transition.is_available.unwrap_or_default()
84                        )
85                    })
86                    .collect::<Vec<String>>()
87                    .join(", ");
88                table.add_row(row![
89                    Fc->issue.id.unwrap_or("".to_string()),
90                    Fy->issue.key.unwrap_or("".to_string()),
91                    Fm->fields,
92                    Fw->transitions
93                ]);
94            }
95        }
96        PrintableData::Project { projects } => {
97            table.add_row(row![
98                bFC->"Project ID",
99                bFc->"Project Key",
100                bFm->"Name",
101                bFw->"Description",
102                bFb->"Category",
103            ]);
104            for project in projects {
105                table.add_row(row![
106                    Fc->project.id.unwrap_or("".to_string()),
107                    Fc->project.key.unwrap_or("".to_string()),
108                    Fm->project.name.unwrap_or("".to_string()),
109                    Fw->project.description.unwrap_or("".to_string()),
110                    Fb->project.project_category.unwrap_or(Box::new(ProjectCategory::default())).name.unwrap_or("".to_string()),
111                ]);
112            }
113        }
114        PrintableData::Version { versions } => {
115            table.add_row(row![
116                bFC->"Project ID",
117                bFc->"ID",
118                bFm->"Name",
119                bFw->"Description",
120                bFy->"Start Date",
121                bFr->"Release Date",
122                bFb->"Archived",
123                bFg->"Released"
124            ]);
125
126            for version in versions {
127                table.add_row(row![
128                    FC->version.project_id.unwrap_or_default(),
129                    Fc->version.id.unwrap_or_default(),
130                    Fm->version.name.unwrap_or_default(),
131                    Fw->version.description.unwrap_or_default(),
132                    Fy->version.start_date.unwrap_or_default(),
133                    Fr->version.release_date.unwrap_or_default(),
134                    Fb->version.archived.unwrap_or_default(),
135                    Fg->version.released.unwrap_or_default()
136                ]);
137            }
138        }
139        PrintableData::VersionRelatedWork {
140            version_related_work_items,
141        } => {
142            table.add_row(row![
143                bFC->"Category",
144                bFb->"Issue ID",
145                bFr->"Related Workitem ID",
146                bFm->"Title",
147                bFy->"URL"
148            ]);
149            for item in version_related_work_items {
150                table.add_row(row![
151                    Fc->item.category,
152                    Fb->item.issue_id.map(|id| id.to_string()).unwrap_or("N/A".to_string()),
153                    Fr->item.related_work_id.unwrap_or("".to_string()),
154                    Fm->item.title.unwrap_or("".to_string()),
155                    Fy->item.url.unwrap_or("".to_string()),
156                ]);
157            }
158        }
159        PrintableData::IssueTransitions { transitions } => {
160            table.add_row(row![
161                bFC->"Transition ID",
162                bFc->"Name",
163                bFm->"fields",
164            ]);
165            for transition in transitions {
166                table.add_row(row![
167                    Fc->transition.id.unwrap_or("".to_string()),
168                    Fc->transition.name.unwrap_or("".to_string()),
169                    Fm->transition.fields.unwrap_or(HashMap::new()).iter().map(|field| format!("{}: {:?}", field.0, field.1)).collect::<Vec<String>>().join(", "),
170                ]);
171            }
172        }
173        PrintableData::IssueType { issue_types } => {
174            table.add_row(row![
175                bFC->"Issue Type ID",
176                bFc->"Name",
177                bFm->"Description",
178                bFw->"Hierarchy Level",
179                bFb->"Subtasks",
180            ]);
181            for issue_type in issue_types {
182                table.add_row(row![
183                    Fc->issue_type.id.unwrap_or("".to_string()),
184                    Fc->issue_type.name.unwrap_or("".to_string()),
185                    Fm->issue_type.description.unwrap_or("".to_string()),
186                    Fw->issue_type.hierarchy_level.map(|hierarchy_level| hierarchy_level.to_string()).unwrap_or("N/A".to_string()),
187                    Fb->issue_type.subtask.unwrap_or(false),
188                ]);
189            }
190        }
191        PrintableData::IssueTypeField { issue_type_fields } => {
192            table.add_row(row![
193                bFC->"Field ID",
194                bFc->"Field Key",
195                bFm->"Field Name",
196                bFb->"Required",
197            ]);
198            for field in issue_type_fields {
199                table.add_row(row![
200                    Fc->field.field_id,
201                    Fc->field.key,
202                    Fm->field.name,
203                    Fb->field.required,
204                ]);
205            }
206        }
207        PrintableData::TransitionedIssue { issues } => {
208            table.add_row(row![
209                bFC->"Issue ID",
210                bFy->"Transitioned",
211                bFm->"Assigned",
212                bFw->"Fix Version"
213            ]);
214            for issue in issues {
215                table.add_row(Row::new(vec![
216                    Cell::new(issue.0.as_str())
217                        .with_style(Attr::Bold)
218                        .with_style(Attr::ForegroundColor(color::CYAN)),
219                    Cell::new(issue.1.as_str()).with_style(if issue.1 == "OK" {
220                        Attr::ForegroundColor(color::GREEN)
221                    } else {
222                        Attr::ForegroundColor(color::RED)
223                    }),
224                    Cell::new(issue.2.as_str()).with_style(if issue.2 == "OK" {
225                        Attr::ForegroundColor(color::GREEN)
226                    } else {
227                        Attr::ForegroundColor(color::RED)
228                    }),
229                    Cell::new(issue.3.as_str()).with_style(if issue.3 != "NO fixVersion set" {
230                        Attr::ForegroundColor(color::GREEN)
231                    } else {
232                        Attr::ForegroundColor(color::RED)
233                    }),
234                ]));
235            }
236        }
237    }
238    table.printstd();
239}
240
241/// This function allows to print the objects details in a pretty way (basic data).
242///
243/// It uses the prettytable library to print the version details.
244///
245/// # Arguments
246///
247/// * `data` - A TablePrintable enum
248///     * Project: A vector of Project structs
249///     * Version: A vector of Version structs
250///     * IssueType: A vector of IssueType structs
251///     * IssueTypeFields: A vector of IssueTypeFields structs
252///
253/// # Examples
254///
255/// ```
256/// use jira_v3_openapi::models::Version;
257/// use jirust_cli::utils::{PrintableData, table_printer::print_table_basic};
258///
259/// let versions: Vec<Version> = vec![Version::new()];
260/// print_table_basic(PrintableData::Version { versions });
261/// ```
262pub fn print_table_basic(data: PrintableData) {
263    let mut table = prettytable::Table::new();
264    match data {
265        PrintableData::Generic { data } => todo!("To Be Implemented! {:?}", data),
266        PrintableData::IssueCreated { issues } => {
267            table.add_row(row![
268                bFC->"Issue ID",
269                bFy->"Issue Key",
270                bFm->"Issue URL",
271            ]);
272            for issue in issues {
273                table.add_row(row![
274                    Fc->issue.id.unwrap_or("".to_string()),
275                    Fy->issue.key.unwrap_or("".to_string()),
276                    Fm->issue.param_self.unwrap_or("".to_string()),
277                ]);
278            }
279        }
280        PrintableData::IssueData { issues } => {
281            table.add_row(row![
282                bFC->"Issue ID",
283                bFy->"Issue Key",
284            ]);
285            for issue in issues {
286                table.add_row(row![
287                    Fc->issue.id.unwrap_or("".to_string()),
288                    Fy->issue.key.unwrap_or("".to_string()),
289                ]);
290            }
291        }
292        PrintableData::Project { projects } => {
293            table.add_row(row![
294                bFC->"Project ID",
295                bFc->"Project Key",
296                bFm->"Name",
297                bFw->"Description",
298                bFb->"Category",
299            ]);
300            for project in projects {
301                table.add_row(row![
302                    Fc->project.id.unwrap_or("".to_string()),
303                    Fc->project.key.unwrap_or("".to_string()),
304                    Fm->project.name.unwrap_or("".to_string()),
305                    Fw->project.description.unwrap_or("".to_string()),
306                    Fb->project.project_category.unwrap_or(Box::new(ProjectCategory::default())).name.unwrap_or("".to_string()),
307                ]);
308            }
309        }
310        PrintableData::Version { versions } => {
311            table.add_row(row![
312                bFC->"Project ID",
313                bFc->"ID",
314                bFm->"Name",
315                bFy->"Start Date",
316                bFr->"Release Date",
317                bFb->"Archived",
318                bFg->"Released"
319            ]);
320
321            for version in versions {
322                table.add_row(row![
323                    FC->version.project_id.unwrap_or_default(),
324                    Fc->version.id.unwrap_or_default(),
325                    Fm->version.name.unwrap_or_default(),
326                    Fy->version.start_date.unwrap_or_default(),
327                    Fr->version.release_date.unwrap_or_default(),
328                    Fb->version.archived.unwrap_or_default(),
329                    Fg->version.released.unwrap_or_default()
330                ]);
331            }
332        }
333        PrintableData::VersionRelatedWork {
334            version_related_work_items,
335        } => {
336            table.add_row(row![
337                bFC->"Category",
338                bFb->"Issue ID",
339                bFr->"Related Workitem ID",
340                bFm->"Title",
341                bFy->"URL"
342            ]);
343            for item in version_related_work_items {
344                table.add_row(row![
345                    Fc->item.category,
346                    Fb->item.issue_id.map(|id| id.to_string()).unwrap_or("N/A".to_string()),
347                    Fr->item.related_work_id.unwrap_or("".to_string()),
348                    Fm->item.title.unwrap_or("".to_string()),
349                    Fy->item.url.unwrap_or("".to_string()),
350                ]);
351            }
352        }
353        PrintableData::IssueTransitions { transitions } => {
354            table.add_row(row![
355                bFC->"Transition ID",
356                bFc->"Name",
357                bFm->"fields",
358            ]);
359            for transition in transitions {
360                table.add_row(row![
361                    Fc->transition.id.unwrap_or("".to_string()),
362                    Fc->transition.name.unwrap_or("".to_string()),
363                    Fm->transition.fields.unwrap_or(HashMap::new()).iter().map(|field| format!("{}: {:?}", field.0, field.1)).collect::<Vec<String>>().join(", "),
364                ]);
365            }
366        }
367        PrintableData::IssueType { issue_types } => {
368            table.add_row(row![
369                bFC->"Issue Type ID",
370                bFc->"Name",
371                bFm->"Description",
372                bFw->"Hierarchy Level",
373                bFb->"Subtasks",
374            ]);
375            for issue_type in issue_types {
376                table.add_row(row![
377                    Fc->issue_type.id.unwrap_or("".to_string()),
378                    Fc->issue_type.name.unwrap_or("".to_string()),
379                    Fm->issue_type.description.unwrap_or("".to_string()),
380                    Fw->issue_type.hierarchy_level.map(|hierarchy_level| hierarchy_level.to_string()).unwrap_or("N/A".to_string()),
381                    Fb->issue_type.subtask.unwrap_or(false),
382                ]);
383            }
384        }
385        PrintableData::IssueTypeField { issue_type_fields } => {
386            table.add_row(row![
387                bFC->"Field ID",
388                bFc->"Field Key",
389                bFm->"Field Name",
390                bFb->"Required",
391            ]);
392            for field in issue_type_fields {
393                table.add_row(row![
394                    Fc->field.field_id,
395                    Fc->field.key,
396                    Fm->field.name,
397                    Fb->field.required,
398                ]);
399            }
400        }
401        PrintableData::TransitionedIssue { issues } => {
402            table.add_row(row![
403                bFC->"Issue ID",
404                bFy->"Transitioned",
405                bFm->"Assigned",
406                bFw->"Fix Version"
407            ]);
408            for issue in issues {
409                table.add_row(Row::new(vec![
410                    Cell::new(issue.0.as_str())
411                        .with_style(Attr::Bold)
412                        .with_style(Attr::ForegroundColor(color::CYAN)),
413                    Cell::new(issue.1.as_str()).with_style(if issue.1 == "OK" {
414                        Attr::ForegroundColor(color::GREEN)
415                    } else {
416                        Attr::ForegroundColor(color::RED)
417                    }),
418                    Cell::new(issue.2.as_str()).with_style(if issue.2 == "OK" {
419                        Attr::ForegroundColor(color::GREEN)
420                    } else {
421                        Attr::ForegroundColor(color::RED)
422                    }),
423                    Cell::new(issue.3.as_str()).with_style(if issue.3 != "NO fixVersion set" {
424                        Attr::ForegroundColor(color::GREEN)
425                    } else {
426                        Attr::ForegroundColor(color::RED)
427                    }),
428                ]));
429            }
430        }
431    }
432    table.printstd();
433}
434
435/// This function allows to print the objects details in a pretty way (single data).
436///
437/// It uses the prettytable library to print the version details.
438///
439///
440/// # Arguments
441///
442/// * `data` - A TablePrintable enum
443///     * Project: A vector of Project structs
444///     * Version: A vector of Version structs
445///     * IssueType: A vector of IssueType structs
446///     * IssueTypeFields: A vector of IssueTypeFields structs
447///
448/// # Examples
449///
450/// ```
451/// use jira_v3_openapi::models::Version;
452/// use jirust_cli::utils::{PrintableData, table_printer::print_table_single};
453///
454/// let version: Version = Version::new();
455/// print_table_single(PrintableData::Version { versions: vec![version] });
456/// ```
457pub fn print_table_single(data: PrintableData) {
458    let mut table = prettytable::Table::new();
459    match data {
460        PrintableData::Generic { data } => todo!("To Be Implemented! {:?}", data),
461        PrintableData::IssueCreated { issues } => {
462            let issue = issues.first().unwrap_or(&CreatedIssue::default()).clone();
463            table.add_row(row![
464                bFC->"Issue ID",
465                bFy->"Issue Key",
466                bFm->"Issue URL",
467            ]);
468
469            table.add_row(row![
470                Fc->issue.id.unwrap_or("".to_string()),
471                Fy->issue.key.unwrap_or("".to_string()),
472                Fm->issue.param_self.unwrap_or("".to_string()),
473            ]);
474        }
475        PrintableData::IssueData { issues } => {
476            let issue = issues.first().unwrap_or(&IssueBean::default()).clone();
477            table.add_row(row![
478                bFC->"Issue ID",
479                bFy->"Issue Key",
480                bFm->"Issue Fields",
481                bFw->"Issue Transitions"
482            ]);
483            let fields = issue
484                .fields
485                .unwrap_or(HashMap::new())
486                .iter()
487                .map(|field| format!("{}: {:?}", field.0, field.1.to_string()))
488                .collect::<Vec<String>>()
489                .join(", ");
490            let transitions = issue
491                .transitions
492                .unwrap_or_default()
493                .iter()
494                .map(|transition| {
495                    format!(
496                        "{}: {} ({})",
497                        transition.clone().id.unwrap_or_default(),
498                        transition.clone().name.unwrap_or_default(),
499                        transition.is_available.unwrap_or_default()
500                    )
501                })
502                .collect::<Vec<String>>()
503                .join(", ");
504            table.add_row(row![
505                Fc->issue.id.unwrap_or("".to_string()),
506                Fy->issue.key.unwrap_or("".to_string()),
507                Fm->fields,
508                Fw->transitions
509            ]);
510        }
511        PrintableData::Project { projects } => {
512            let project = projects.first().unwrap_or(&Project::default()).clone();
513            table.add_row(row![
514                bFC->"Project ID",
515                bFc->"Project Key",
516                bFm->"Name",
517                bFw->"Description",
518                bFb->"Category",
519            ]);
520
521            table.add_row(row![
522                    Fc->project.id.unwrap_or("".to_string()),
523                    Fc->project.key.unwrap_or("".to_string()),
524                    Fm->project.name.unwrap_or("".to_string()),
525                    Fw->project.description.unwrap_or("".to_string()),
526                    Fb->project.project_category.unwrap_or(Box::new(ProjectCategory::default())).name.unwrap_or("".to_string()),
527                ]);
528        }
529        PrintableData::Version { versions } => {
530            let version = versions.first().unwrap_or(&Version::default()).clone();
531            table.add_row(row![
532                bFm->"Name",
533                bFy->"Start Date",
534                bFr->"Release Date",
535            ]);
536
537            table.add_row(row![
538                Fm->version.name.unwrap_or_default(),
539                Fy->version.start_date.unwrap_or_default(),
540                Fr->version.release_date.unwrap_or_default(),
541            ]);
542        }
543        PrintableData::VersionRelatedWork {
544            version_related_work_items,
545        } => {
546            table.add_row(row![
547                bFC->"Category",
548                bFb->"Issue ID",
549                bFr->"Related Workitem ID",
550                bFm->"Title",
551                bFy->"URL"
552            ]);
553            for item in version_related_work_items {
554                table.add_row(row![
555                    Fc->item.category,
556                    Fb->item.issue_id.map(|id| id.to_string()).unwrap_or("N/A".to_string()),
557                    Fr->item.related_work_id.unwrap_or("".to_string()),
558                    Fm->item.title.unwrap_or("".to_string()),
559                    Fy->item.url.unwrap_or("".to_string()),
560                ]);
561            }
562        }
563        PrintableData::IssueTransitions { transitions } => {
564            let transition = transitions
565                .first()
566                .unwrap_or(&IssueTransition::default())
567                .clone();
568            table.add_row(row![
569                bFC->"Transition ID",
570                bFc->"Name",
571                bFm->"fields",
572            ]);
573            table.add_row(row![
574                Fc->transition.id.unwrap_or("".to_string()),
575                Fc->transition.name.unwrap_or("".to_string()),
576                Fm->transition.fields.unwrap_or(HashMap::new()).iter().map(|field| format!("{}: {:?}", field.0, field.1)).collect::<Vec<String>>().join(", "),
577            ]);
578        }
579        PrintableData::IssueType { issue_types } => {
580            let issue_type = issue_types
581                .first()
582                .unwrap_or(&IssueTypeIssueCreateMetadata::default())
583                .clone();
584            table.add_row(row![
585                bFC->"Issue Type ID",
586                bFc->"Name",
587                bFm->"Description",
588                bFw->"Hierarchy Level",
589                bFb->"Subtasks",
590            ]);
591
592            table.add_row(row![
593                Fc->issue_type.id.unwrap_or("".to_string()),
594                Fc->issue_type.name.unwrap_or("".to_string()),
595                Fm->issue_type.description.unwrap_or("".to_string()),
596                Fw->issue_type.hierarchy_level.map(|hierarchy_level| hierarchy_level.to_string()).unwrap_or("N/A".to_string()),
597                Fb->issue_type.subtask.unwrap_or(false),
598            ]);
599        }
600        PrintableData::IssueTypeField { issue_type_fields } => {
601            let field = issue_type_fields
602                .first()
603                .unwrap_or(&FieldCreateMetadata::default())
604                .clone();
605            table.add_row(row![
606                bFC->"Field ID",
607                bFc->"Field Key",
608                bFm->"Field Name",
609                bFb->"Required",
610            ]);
611
612            table.add_row(row![
613                Fc->field.field_id,
614                Fc->field.key,
615                Fm->field.name,
616                Fb->field.required,
617            ]);
618        }
619        PrintableData::TransitionedIssue { issues } => {
620            table.add_row(row![
621                bFC->"Issue ID",
622                bFy->"Transitioned",
623                bFm->"Assigned",
624                bFw->"Fix Version"
625            ]);
626            for issue in issues {
627                table.add_row(Row::new(vec![
628                    Cell::new(issue.0.as_str())
629                        .with_style(Attr::Bold)
630                        .with_style(Attr::ForegroundColor(color::CYAN)),
631                    Cell::new(issue.1.as_str()).with_style(if issue.1 == "OK" {
632                        Attr::ForegroundColor(color::GREEN)
633                    } else {
634                        Attr::ForegroundColor(color::RED)
635                    }),
636                    Cell::new(issue.2.as_str()).with_style(if issue.2 == "OK" {
637                        Attr::ForegroundColor(color::GREEN)
638                    } else {
639                        Attr::ForegroundColor(color::RED)
640                    }),
641                    Cell::new(issue.3.as_str()).with_style(if issue.3 != "NO fixVersion set" {
642                        Attr::ForegroundColor(color::GREEN)
643                    } else {
644                        Attr::ForegroundColor(color::RED)
645                    }),
646                ]));
647            }
648        }
649    }
650
651    table.printstd();
652}