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
11pub 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
241pub 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
435pub 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}